2013-08-02 9 views
7

sto cercando di trasporre una mappa in modo che:trasporre una mappa raccogliendo chiavi lungo la strada

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

diventa

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

(tutte le variabili sono stringhe) fare qualcosa di simile

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

mi fa parzialmente, ma calpesta il primo nuovo valore per "y". Ottengo solo: [y: w, b: a]

Qual è il modo migliore per sommergere i nuovi valori in un array per la loro nuova chiave comune? Grazie per qualsiasi aiuto o suggerimento.

risposta

16

Spero che questo aiuta:

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

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

Grazie, Kunal questo è fantastico! –

+0

Sono contento che abbia aiutato :) – kunal

2

ho avuto un requisito analogo, ma aveva bisogno di singoli tasti (una specie di pivot), quindi la mia soluzione è un po 'diverso:

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]] 
Problemi correlati