我有一个看起来像这两数组列表,(这我要简化这个问题):的Groovy - ArrayList的一个递增项目数量,而不是重新添加
def originalList = [[name: "Ben", age: 21, weight: 80], [name: "Martin", age: 36, weight: 99], [name: "Sammy", age: 18, weight: 65], [name: "Ben", age: 28, weight: 75], [name: "Ben", age: 28, weight: 120]]
另一位我会请拨打newList
并开始为空,即def newList = []
,但会添加属性name
,age
和occurrences
。
现在我想做的是循环遍历originalList
,并添加其项目newList
但如果newList
已经包含具有相同名称和年龄属性的项目我想递增occurrences
属性的项目,如:
def newList = [[name: "Ben", age: 21, occurrences: 1], [name: "Martin", age: 36, occurrences: 1], [name: "Sammy", age: 18, occurrences: 1], [name: "Ben", age: 28, occurrences: 2]]
我该如何着手完成这项工作?这是我尝试过的。
originalList.each {
newList.eachWithIndex { nl, i ->
if(nl.name.equals(it.name) && nl.age == it.age) {
nl.occurrances++
} else {
newList.add([name: it.name, age: it.age, occurrances: 0])
}
}
}
它看起来像它不工作怎么把newList.eachWithIndex
永远循环怎么把它开始是空的,怎么把它永远循环可以永远递增occurrences
财产或项目添加到列表中。
或者只需通过将您感兴趣的k/v集合分组即可摆脱第一层即可:'originalList.groupBy {it.subMap(“name”,“age”)}。collect {k,os-> k + [occurrences: os.size()]}' – cfrick
@cfrick,很好!你是否每天都与groovy合作? – Opal
或'originalList.groupBy {“$ it.name :: $ it.age”} .values()。collect {it.head()+ [occurrences:it.size()]}' –