Rubyでハッシュの中に重複した値があるか調べる
タグ: ruby / 初版公開: 2014-08-04

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の方がメソッドの呼び出しが少ないのでスマートだろう。