2017-03-06 22 views
0
  1. 在常规的组,我有maps.Each地图的列表中包含3个键与 各自的值,如:如何形成相同值和键

    def group= [] as DataList 
    def groupRequiredMap = ["a": Metadata.groupName, 
             "b": Metadata.instance, 
             "c": Metadata.color] 
        group << groupRequiredMap 
    

    组的输出被作为如下::

    [[a:apple, b:0, c:red], 
    [a:apple, b:0, c:green], 
    [a:apple, b:0, c:blue], 
    [a:apple, b:1, c:brown], 
    [a:apple, b:1, c:violet], 
    [a:grapes, b:0, c:black], 
    [a:grapes, b:0, c:yellow], 
    [a:grapes, b:1, c:orange], 
    [a:grapes, b:1, c:pink]] 
    

欲形成一组与b = 0,一组用b = 1苹果苹果的,一组用b = 0葡萄和一组克用b强奸= 1等等。笔者想输出是这样的:

[[a:apple, b:0, c:[red, green, blue]], 
[a:apple, b:1, c:[brown,violet]], 
[a:grapes, b:0, c:[black,yellow]], 
[a:grapes, b:1, c:[orange,pink]] 
+1

你坚持了哪一点?你有一些不起作用的代码吗? –

回答

0

在这里你去:

List list = [[a:'apple', b:0, c:'red'], [a:'apple', b:0, c:'green'], [a:'apple', b:0, c:'blue'], [a:'apple', b:1, c:'brown'], [a:'apple', b:1, c:'violet'], [a:'grapes', b:0, c:'black'], [a:'grapes', b:0, c:'yellow'], [a:'grapes', b:1, c:'orange'], [a:'grapes', b:1, c:'pink']] 

List result = []  

list.groupBy ({it.a},{it.b}).each { a -> 
    a.value.each { b -> 
     result << [a: a.key, b: b.key, c: b.value.c] 
    } 
} 

result 
+0

Thanks @Anton Hlinistry这正是我想要的,但是如果我们有4张地图而不是3.will它会起作用吗?像:def groupRequiredMap = [“a”:Metadata.groupName, “b”:Metadata.instance, “c”:Metadata.color,“d”:Metadata.required] –

+0

List list = [[a:'apple',b:0,c:'red',d:'required'],[a:'apple ',b:0,c:'green','required'],[a:'apple',b:0,c:'blue',d:“可选],[a:'apple',b:1 ,c:'brown',d:必须],[a:'apple',b:1,c:'violet',d:可选],[a:'葡萄',b:0,c:'黑色' ,d:'required'],[a:'grapes',b:0,c:'yellow',d:'optional'],[a:'葡萄',b:1,c:'orange',d :'required'],[a:'grapes',b:1,c:'pink',d:'optional']] –

+0

取决于你如何处理“d”。 –

0

代替each和变异的列表,你可以这样做:

def list = [[a:'apple', b:0, c:'red'], 
       [a:'apple', b:0, c:'green'], 
       [a:'apple', b:0, c:'blue'], 
       [a:'apple', b:1, c:'brown'], 
       [a:'apple', b:1, c:'violet'], 
       [a:'grapes', b:0, c:'black'], 
       [a:'grapes', b:0, c:'yellow'], 
       [a:'grapes', b:1, c:'orange'], 
       [a:'grapes', b:1, c:'pink']] 

List result = list.groupBy({it.a}, {it.b}).collectMany { aValue, groupA -> 
    groupA.collect { bValue, values -> [a: aValue, b: bValue, c:values] } 
} 
0

groupBy是你想要的第一件事。因此,分组的关键是subMap("a","b") - 一张只包含原始地图的“a”和“b”键的键/值的地图。之后,通过传播运算符*.将“关键地图”与包含所有“c”的新地图组合在一起。

list.groupBy{ it.subMap("a","b") }.collect{ k, ms -> k + [c: ms*.c] } 
相关问题