2017-02-12 6 views
0

私のような配列を含むマップがあります。fruits = [[apples, bananas, pears]:lunch, [apples, grapes]:dinner, [pears, mango, oranges]:breakfast, [mango]:snack]groovyでマップ内の配列にアクセスするにはどうすればよいですか?

を、私は同じ繰り返し果物と関連した食事と一緒に出力することを見つける必要があり、例えば出力がapples:lunchapples: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()] } 
(必要に応じ)

そして、2回のだけの食事に現れるものを保つ:

.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'] 
] 
関連する問題