Groovy 更改嵌套在其他贴图中的贴图的值
使用HQL查询,我能够生成以下映射,其中键表示java.util.Calendar中定义的月数常量,每个值都是一个映射:Groovy 更改嵌套在其他贴图中的贴图的值,groovy,Groovy,使用HQL查询,我能够生成以下映射,其中键表示java.util.Calendar中定义的月数常量,每个值都是一个映射: [ 0:[ client_a:[order1, order2, order3]], 1:[ client_b:[order4], client_c:[order5, order6], client_d:[order7]], 2:[ client_e:[order8, order9], client_f:[order10]] ] 订单1,订单2。。。是
[
0:[ client_a:[order1, order2, order3]],
1:[ client_b:[order4], client_c:[order5, order6], client_d:[order7]],
2:[ client_e:[order8, order9], client_f:[order10]]
]
订单1,订单2。。。是名为Order的域类的实例:
class Order {
String description
Date d
int quantity
}
现在我得到了这个结构,其中包含属于某个特定年份的订单,但我并不真正关心订单对象本身。我只想知道每个月所有订单的数量之和。所以结构应该是这样的:
[
0:[ client_a:[321]],
1:[ client_b:[9808], client_c:[516], client_d:[20]],
2:[ client_e:[22], client_f:[10065]]
]
我不介意这些值是一个元素的列表还是根本不是列表。如果这是可能的,无论如何都可以:
[
0:[ client_a:321 ],
1:[ client_b:9808, client_c:516, client_d:20 ],
2:[ client_e:22, client_f:10065 ]
]
我知道我必须对每个订单列表应用类似于.sum{it.quantity}
的东西才能得到我想要的结果,但我不知道如何迭代它们,因为它们嵌套在另一个映射中
谢谢。给你:
class Order {
String description
Date d
int quantity
}
def orders = [
0:[ client_a:[new Order(quantity:1), new Order(quantity:2), new Order(quantity:3)]],
1:[ client_b:[new Order(quantity:4)], client_c:[new Order(quantity:5), new Order(quantity:6)], client_d:[new Order(quantity:7)]],
2:[ client_e:[new Order(quantity:8), new Order(quantity:9)], client_f:[new Order(quantity:10)]]
]
def count = orders.collectEntries { k, v ->
def nv = v.collectEntries { nk, nv ->
[(nk): nv*.quantity.sum()]
}
[(k):(nv)]
}
assert count == [0:[client_a:6], 1:[client_b:4, client_c:11, client_d:7],2:[client_e:17, client_f:10]]
您也可以使用
val.sum{it.q}
而不是val*.q.sum()
这两个答案都很有效,但蛋白石先回答。无论如何谢谢你!哈哈,不用担心。您将了解使用collectEntries
的两种不同格式,一种采用地图(Opal的方法),另一种采用列表(我的方法):)这就是为什么我没有删除我的答案时,我看到蛋白石的方法是完全相同的,只有一分钟的例外。
def map = [
0:[ client_a:[[q: 23], [q: 28], [q: 27]]],
1:[ client_b:[[q: 50]], client_c:[[q: 100], [q: 58]], client_d:[[q: 90]]],
2:[ client_e:[[q: 48], [q: 60]], client_f:[[q: 72]]]
]
map.collectEntries { k, v ->
[ k, v.collectEntries { key, val ->
[ key, val*.q.sum() ]
} ]
}