2016-10-08 8 views
1

3つのプロパティでグループ化したいが、それぞれのプロパティをネストされた配列にする必要はない。私が何をしたいです:GROUPBY()複数のクロージャと方法を使用して2つ以上のプロパティを1つのレベルだけグルーピングする手の込んだ方法

def values=[ 
    [day:1,month:1,year:1], 
    [day:1,month:1,year:1], 
    [day:2,month:1,year:1], 
    [day:2,month:2,year:1] 
]; 

/*...some code to group by DAY, MONTH, AND YEAR 

..desired result is that items with the same day, 
    month, and year end up in a one level deep subarray 
*/ 

    [ 
    [[day:1,month:1,year:1],[day:1,month:1,year:1]], 
    [[day:2,month:1,year:1]] , 
    [[day:2,month:2,year:1]] 
    ]; 

ではありません[年[月[日[]]]]のように、独自のネストされた配列として私に各グループ化されたプロパティを提供します私は何が必要です。

答えて

1

、キーが適切なグループであり、値が必要なリストであるマップを構築するためにinject次の使用を考えてみましょう:

編集コメントごとに、マップキーの建設を更新)

def values=[ 
    [day:1,month:1,year:1], 
    [day:1,month:1,year:1], 
    [day:2,month:1,year:1], 
    [day:2,month:2,year:1] 
]; 

def groupMap = [:].withDefault{ key -> [] } 

def result = values.inject(groupMap) { val, m -> 
    val["${m.'day'}:${m.'month'}:${m.'year'}"] << m 
    val 
}.values() 

assert [[day:1, month:1, year:1], [day:1, month:1, year:1]] == result[0] 
assert [[day:2, month:1, year:1]] == result[1] 
assert [[day:2, month:2, year:1]] == result[2] 
+0

awesome;ありがとう。 – user2782001

+0

.groupBy({...})の後に.values()を呼び出すと、同じ結果につながります。 – norganos

+0

また、グループ化に使用される「キー」パターンを再度確認してください。この例では単純な文字列を使用していますが、1月11日と11月1日は区別できません(入力値が本当に質問状態の単純整数の場合) – norganos

2

あなたはちょうどあなたが必要なものを行うにはGROUPBY機能を採用したいと思います。この例では、マップにグループ化するIDがすでにあります。

// submap only the needed keys (in case there is more in `values` than just your identity 
println values.groupBy{ it.subMap(["year","month","day"]) }.values() 
// => [[[day:1, month:1, year:1], [day:1, month:1, year:1]], [[day:2, month:1, year:1]], [[day:2, month:2, year:1]]] 

:あなたが実際にそこにあなたのマップに複数の値を持っていない場合、あなたは1つのレベルにグループにsubMapを使用することができますし、

def values=[ 
    [day:1,month:1,year:1], 
    [day:1,month:1,year:1], 
    [day:2,month:1,year:1], 
    [day:2,month:2,year:1], 
] 

// just the identity 
println values.groupBy().values() 
// => [[[day:1, month:1, year:1], [day:1, month:1, year:1]], [[day:2, month:1, year:1]], [[day:2, month:2, year:1]]] 

:これはあなたが探している結果のために十分ですニックピッキングの面では、ネストされたマップです。

関連する問題