要在遍历列表时为每个映射键生成一个列表?
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]]
我有一张地图,我需要在 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]]