2013-08-02 55 views
7

Tôi đang cố gắng để transpose bản đồ để:transpose một bản đồ thu thập các phím trên đường đi

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

trở thành

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

(tất cả các biến là chuỗi) Làm cái gì đó như

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

giúp tôi trở thành một phần, nhưng hãy ghi lại giá trị mới đầu tiên cho "y". Tôi chỉ nhận được: [y: w, b: a]

Cách tốt nhất để slurp các giá trị mới vào một mảng cho khóa mới chung của chúng là gì? Cảm ơn bạn đã giúp đỡ hoặc gợi ý.

Trả lời

16

Tôi hy vọng điều này sẽ giúp:

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

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

Cảm ơn, Kunal , điều đó thật tuyệt! –

+0

Tôi vui vì nó đã giúp :) – kunal

2

Tôi đã có một yêu cầu tương tự, nhưng cần chìa khóa cá nhân (loại một trục), vì vậy giải pháp của tôi là một chút khác nhau:

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