Twitterで見かけて目からウロコだったので紹介する。
以下のようなハッシュがある時に、ハッシュの値に重複した値があるかを調べたいとする。
h = {a:1, b:2, c:3, d:1}
重複した値があるかは以下のように調べられる。 Hash#invertでキーと値を逆にしたハッシュを生成する。 キーと値を逆にしたハッシュは、重複した値がある場合にサイズが少なくなる。 これを元のハッシュのサイズと比較することで、重複した値があるかを判定できる。
if h.size == h.invert.size
puts "重複した値なし"
else
puts "重複した値あり"
end
Hash#valuesで値の配列を作って、Array#uniqしてサイズを比較しても、同じ結果が得られる。 ただHash#invertの方がメソッドの呼び出しが少ないのでスマートだろう。
