2013-08-02 12 views
7

Próbuję przenieść mapę tak, że:transpozycji mapę zbierając klucze po drodze

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

staje

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

(wszystkie zmienne są ciągi) Uprawiając jak

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

doprowadza mnie do końca, ale tupie pierwszą nową wartością "y". Dostaję tylko: [y: w, b: a]

Jaki jest najlepszy sposób wyskoczenia nowych wartości do tablicy dla wspólnego nowego klucza? Dzięki za pomoc lub sugestie.

Odpowiedz

16

Mam nadzieję, że to pomoże:

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

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

Dzięki, Kunal , to jest świetne! –

+0

Cieszę się, że pomogło :) – kunal

2

Miałem podobny wymóg, ale potrzebne poszczególne klawisze (rodzaj pivot), więc moje rozwiązanie jest trochę inna:

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