2013-08-02 9 views
7

Ich versuche, eine Karte zu transponieren, so dass das Sammeln:transponieren Karte Schlüssel auf dem Weg

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

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

(alle Variablen sind Strings) Doing so etwas wie

["x": "y", "w": "y", "a": "b"].collectEntries { [it.value, it.key] } 

bekommt mich Teilweise weg, stampft aber auf den ersten neuen Wert für "y". Ich bekomme nur: [y: w, b: a]

Was ist der beste Weg, um die neuen Werte in einem Array für ihren gemeinsamen neuen Schlüssel zu schlürfen? Danke für jede Hilfe oder Vorschläge.

Antwort

16

Ich hoffe, das hilft:

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

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

Danke, Kunal , das ist toll! –

+0

Ich bin froh, dass es geholfen hat :) – kunal

2

ich eine ähnliche Forderung hatte, aber benötigt individuelle Schlüssel (Art eines Dreh), so meine Lösung ist ein wenig anders:

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]] 
Verwandte Themen