Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy 更改嵌套在其他贴图中的贴图的值_Groovy - Fatal编程技术网

Groovy 更改嵌套在其他贴图中的贴图的值

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。。。是

使用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。。。是名为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() ]
    } ]
}