見出し画像

[Ruby] Hashの比較について

2つのhashを比較するには?

== を使う

== 演算子を使用することで、hashの中身まで一致しているかを判定することができます。

hash1 = {"flower" => "花", "grass" => "草", "tree" => "木" }
hash2 = {"flower" => "花", "grass" => "草", "tree" => "木" }
hash3 = {"flower" => "花", "grass" => "草", "water" => "水" }

hash1 == hash2  #=> true
hash2 == hash3  #=> false

また、==演算子を使った場合、同じキーと値の組み合わせがあれば、順番が違ってもtrueと判定されます。

自身と other が同じ数のキーを保持し、キーが eql? メソッドで比較して全て等しく、 値が == メソッドで比較して全て等しい場合に真を返します。
Hashファレンスより
hash1 = {"flower" => "花", "grass" => "草", "tree" => "木" }
hash2 = {"flower" => "花", "tree" => "木", "grass" => "草" }

hash1 == hash2  #=> true

to_aしてから==を使う

もし、順番まで一致しているか比較したいのであれば、to_a(Arrayに変換)してから==演算子を使うことで判定できます。

hash1 = {"flower" => "花", "grass" => "草", "tree" => "木" }
hash2 = {"flower" => "花", "grass" => "草", "tree" => "木" }
hash3 = {"flower" => "花", "tree" => "木", "grass" => "草" }

hash1.to_a == hash2.to_a  #=> true
hash2.to_a == hash3.to_a  #=> false

Arrayは順序つきで比較していくためです。

自身と other の各要素をそれぞれ順に == で比較し て、全要素が等しければ true を返します。そうでない場合には false を返します。
Arrayリファレンスより


CSVのヘッダーなど、順序を維持した状態でhashをチェックしたい場合は後者を使うと良いですね!😄

おまけ

2つのhashの差分を取得するには?

hashをto_aでArrayに変換した後、-演算子を使って2つのArrayの差分を取得できます。
差分を取得できたら、Hashに戻します。

hash1 = {"flower" => "花", "grass" => "草" }
hash2 = {"flower" => "花", "grass" => "草", "tree" => "木" }

diff = hash2.to_a - hash1.to_a  #=> [["tree", "木"]]
Hash[*diff.flatten]  #=> {"tree"=>"木"}

この記事が気に入ったらサポートをしてみませんか?