Nếu bạn có một băm mà là chìa khóa là duy nhất, bạn có thể sử dụng Hash#invert:
> {a: 1, b: 2, c: 3}.invert
=> {1=>:a, 2=>:b, 3=>:c}
Điều đó sẽ không hoạt động nếu bạn có các phím không độc đáo, tuy nhiên, nơi chỉ có các phím nhìn thấy lần cuối sẽ giữ:
> {a: 1, b: 2, c: 3, d: 3, e: 2, f: 1}.invert
=> {1=>:f, 2=>:e, 3=>:d}
Nếu bạn có một băm với các phím không duy nhất, bạn có thể làm:
> hash={a: 1, b: 2, c: 3, d: 3, e: 2, f: 1}
> hash.each_with_object(Hash.new { |h,k| h[k]=[] }) {|(k,v), h|
h[v] << k
}
=> {1=>[:a, :f], 2=>[:b, :e], 3=>[:c, :d]}
Nếu các giá trị của băm đã là mảng, bạn có thể làm:
> hash={ "A" => [14, 15, 16], "B" => [17, 15], "C" => [35, 15] }
> hash.each_with_object(Hash.new { |h,k| h[k]=[] }) {|(k,v), h|
v.map {|t| h[t] << k}
}
=> {14=>["A"], 15=>["A", "B", "C"], 16=>["A"], 17=>["B"], 35=>["C"]}
Rất có liên quan! Cảm ơn bạn đã chỉ ra, tôi đã không kiểm tra những trường hợp đó. –
['each_with_object'] (http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-each_with_object) có ý nghĩa hơn ở đây so với' inject'. –
để trở thành 'each_with_object ({}) {| i, o | k, v = * i; o [v] || = []; o [v] << k} '... đẹp –