[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"=>"木"}
この記事が気に入ったらサポートをしてみませんか?