如何在groovy中访问地图内的数组?

use*_*743 0 groovy

我有一个包含数组的映射: fruits = [[apples, bananas, pears]:lunch, [apples, grapes]:dinner, [pears, mango, oranges]:breakfast, [mango]:snack]

我需要找到相同的重复水果并将它们与相关的膳食一起输出,例如输出将是apples:lunchapples:dinner

我试过flatten.()了数组但没有成功:

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

tim*_*tes 5

好的,给出以下地图:

def fruits = [['apples', 'bananas', 'pears']:'lunch',
              ['apples', 'grapes']:'dinner',
              ['pears', 'mango', 'oranges']:'breakfast',
              ['mango']:'snack']
Run Code Online (Sandbox Code Playgroud)

您可以获得所有密钥的列表:

fruits.keySet().flatten()
Run Code Online (Sandbox Code Playgroud)

然后循环浏览,并收集每个食物的地图(将它们收集到列表中):

.collectEntries { f -> [f, fruits.findAll { it.key.contains(f) }.values().collect()] }
Run Code Online (Sandbox Code Playgroud)

并且(如果你想),只保留两餐中出现的那些:

.findAll { it.value.size() > 1 }
Run Code Online (Sandbox Code Playgroud)

所以把它们放在一起,

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

为你带来:

assert repeatedIngredients == [
    'apples':['lunch', 'dinner'],
    'pears':['lunch', 'breakfast'],
    'mango':['breakfast', 'snack']
]
Run Code Online (Sandbox Code Playgroud)