要在遍历列表时为每个映射键生成一个列表?

To generate a list for each map key as iterating through list?

我有一张地图,我需要在 groovy 中为每个地图键插入一个生成的列表,因为我正在遍历列表!

代码:

def myMap = [:]
    anotherList.each{
    object -> //here i do some work to get two elements
    def element1 = ..
    def element2 = ..

    // so here i need to generate a list for the two elements with index 0 and 1
    myMap[obejct]= ['list', my list] 
    }
   return myMap

您可以使用 [ key: value] 符号创建地图。由于您的值是两个元素的数组,您可以使用 [element1,element2] 符号简单地创建它,然后您可以使用 << operator 将对象添加到地图。

所以这个 myMap << [ (object) : [element1,element2]] 可以完成这项工作。

在您的代码中:

   def myMap = [:]
    anotherList.each{
    object -> //here i do some work to get two elements
    def element1 = ..
    def element2 = ..

    // so here i need to generate a list for the two elements with index 0 and 1
     myMap << [ (object) :  [element1,element2]]
    }
   return myMap

请注意,我使用 (object) 来评估键,因为如果我直接使用 object,文字将用作映射中的键而不是值。

希望这对您有所帮助,

根据操作评论更新:

如果我很好地理解您的要求,您希望地图键是索引而不是值,不是吗?为此,您可以使用 eachWithIndex 而不是 each,例如:

def myMap = [:]
  def anotherList = ['a','b','c','d']
    anotherList.eachWithIndex{ object,index -> //here i do some work to get two elements
    def element1 = object + 'z'
    def element2 = object + 'x'

    // so here i need to generate a list for the two elements with index 0 and 1
     myMap << [ (index) :  [element1,element2]]
    }
   return myMap //Result: [0:[az, ax], 1:[bz, bx], 2:[cz, cx], 3:[dz, dx]]

您可以使用方法 collect 遍历您的列表并生成另一个列表,其值取决于原始列表(您在该方法中使用的推理由您决定。这里有一个小例子:

    def originalList = [1,2,3]
    def result = originalList.collect{obj->
        def e1 = obj
        def e2 = obj*2
        [e1,e2]
    }
    println result //[[1,1],[2,4],[3,6]]

编辑:抱歉,我忽略了您期望得到地图的事实。这是一种类似于上述方法的方法。在这种情况下,您使用 each 遍历列表的元素:

def originalList = [[name: 'franz', age: 12], [name: 'bepi', age: 20],[name: 'giovanni', age: 65]]
def result=[:]
originalList.each{obj->
    def e1 = obj.age
    def e2 = obj.age*2
    result.put(obj, [e1,e2]) //key, value
}
println result //[[name:franz, age:12]:[12, 24], [name:bepi, age:20]:[20, 40], [name:giovanni, age:65]:[65, 130]]