2013-08-02 4 views
7

に沿ってキーを収集マップをトランスポーズ:は私がするようにマップを転置しようとしている道

[x: y, w: y, a: b] 

[y: [x, w], b: a] 

なり(すべての変数は文字列です)

["x": "y", "w": "y", "a": "b"].collectEntries { [it.value, it.key] } 
のようなものをやって

は私には分かりませんが、 "y"の最初の新しい値を突き止めます。

一般的な新しいキーのために新しい値を配列にスラッシュアップする最も良い方法は何ですか?[y:w、b:a] ご協力ありがとうございます。

答えて

16

私はこれが役に立てば幸い:

def map = ["x": "y", "w": "y", "a": "b"] 

map.groupBy{ it.value }.collectEntries{ k, v -> [k, v.keySet()] } 
+0

おかげで、クナル、 これは素晴らしい! –

+0

私はそれが助けてうれしいです:) – kunal

2

私の解決策は少し異なっているので、私は、同様の要件があったが、(ピボットの一種)個々のキーを必要と:

def map = ["x": "y", "w": "y", "a": "b"] 
def newKeys = map.collect{ it.value }.flatten() as Set 
def transpose = newKeys.collectEntries{ [ 
    (it): map.findAll{ k, v -> v.contains(it) }.collect{ it.key } 
]} 
println transpose 
// [y:[x, w], b:[a]] 
関連する問題