Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

transpose a map collecting keys along the way

I'm trying to transpose a map so that:

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

becomes

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

(all variables are strings) Doing something like

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

gets me part way, but stomps on the first new value for "y". I only get: [y:w, b:a]

What is the best way to slurp up the new values into an array for their common new key? Thanks for any help or suggestions.

like image 697
Scott Presnell Avatar asked Aug 02 '13 17:08

Scott Presnell


2 Answers

I hope this helps :

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

map.groupBy{ it.value }.collectEntries{ k, v -> [k, v.keySet()] }
like image 69
kdabir Avatar answered Nov 13 '22 15:11

kdabir


I had a similar requirement, but needed individual keys (kind of a pivot), so my solution is a little different:

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]]
like image 33
IT Gumby Avatar answered Nov 13 '22 15:11

IT Gumby