2017-02-12 5 views
0

У меня есть карта, которая содержит массивы в качестве таковых: fruits = [[apples, bananas, pears]:lunch, [apples, grapes]:dinner, [pears, mango, oranges]:breakfast, [mango]:snack]Как получить доступ к массивам внутри карты в groovy?

и мне нужно, чтобы найти те же повторяющиеся фрукты и выводить их вместе с сопутствующим приемом пищи, например, выход будет apples:lunch и apples:dinner

У меня есть пытался flatten.() массива, но не удалось:

fruits.flatten().countBy{it}.findAll {it.value > 1}.keySet()

ответ

5

Ok, учитывая следующую карту:

def fruits = [['apples', 'bananas', 'pears']:'lunch', 
       ['apples', 'grapes']:'dinner', 
       ['pears', 'mango', 'oranges']:'breakfast', 
       ['mango']:'snack'] 

Вы можете получить список всех ключей:

fruits.keySet().flatten() 

Затем цикл через это, и собрать карту каждого к еде они находятся в (собирая их в список):

.collectEntries { f -> [f, fruits.findAll { it.key.contains(f) }.values().collect()] } 

И (если вы хотите), оставьте только те, которые появляются в два приема пищи:

.findAll { it.value.size() > 1 } 

Так положить все это вместе,

def repeatedIngredients = fruits.keySet() 
     .flatten() 
     .collectEntries { f -> [f, fruits.findAll { it.key.contains(f) }.values().collect()] } 
     .findAll { it.value.size() > 1 } 

Чтобы дать Вам:

assert repeatedIngredients == [ 
    'apples':['lunch', 'dinner'], 
    'pears':['lunch', 'breakfast'], 
    'mango':['breakfast', 'snack'] 
]