2016-08-16 6 views
1

こんにちは、私はGroovyを初めて使っていて、これを試してきましたが、正しい解決策を考え出すことができませんでした。Groovyのフィールド値に基づいて、リストのマップにオブジェクトのリストをカスタムキーと組み合わせる方法は?

基本的には、特定のフィールドの一部を相関させ、変換されたキーを使ってマップに配置する必要があるオブジェクトのリストがあります。以下の例では、3番目のフィールドの値を最初の4文字(たとえばkey3、key4)と関連付けてマップに入れる必要があります。したがって、すべてのkey3オブジェクトとkey4オブジェクトを別々のマップに入れ、key3とkey4を持つ1つのマップとそれらの元の値をリストとして組み合わせます。

Foo[] foo = [ 
    ["field1a", "field2a", "key3a"], 
    ["field1b", "field2b", "key3b"], 
    ["field1c", "field2c", "key4c"] 
] 
私は(サブストリング)と)(ユニーク、コレクトの組み合わせを()を使用して、独自のキーを入手することができましたこれまでのところ

result = [ 
     "key3":[ 
      ["field1a", "field2a", "key3a"], 
      ["field1b", "field2b", "key3b"] 
     ], 
     "key4":[ 
      ["field1c", "field2c", "key4c"] 
     ] 
    ] 

、しかし、私は構築することができませんマップは適切に。私はcollectEntries()を使用しましたが、リストのマップではなくオブジェクトのマップを作成するだけです。

誰かが私を正しい方向に向けることができれば、本当に大きな助けになるでしょう。ありがとう!

答えて

3

groupByを使用してください。

assert foo.groupBy { it[-1][0..-2] } == [ 
    key3:[ 
     ['field1a', 'field2a', 'key3a'], 
     ['field1b', 'field2b', 'key3b'] 
    ], 
    key4:[ 
     ['field1c', 'field2c', 'key4c'] 
    ] 
] 

説明:リストit[-1]第三/最後の要素によって
グループだけサブkey3を検討し、それゆえit[-1][0..-2]

+0

すごいです!魅力のように働く。どうもありがとうございました。 – victor

関連する問題