質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

5回答

2683閲覧

配列のなかにある、順番の異なるハッシュを比較する方法

hiepita1

総合スコア37

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/02/07 11:34

お世話になっております。
配列に格納されている2つのハッシュを比較して、値が等しいかどうかを判断したいです。
その際に、格納されている順番が異なっていても等しいという判断をしたいです。
良い方法はないでしょうか?

hash1 = [{"a"=> 1,"b"=> 1},{"a"=> 2,"b"=> 2}] hash2 = [{"a"=> 2,"b"=> 2},{"a"=> 1,"b"=> 1}] hash3 = [{"a"=> 1,"b"=> 3},{"a"=> 2,"b"=> 2}] hash4 = [{"a"=> 1,"b"=> 1},{"a"=> 2,"b"=> 2},{"a"=> 3,"b"=> 3} ] hash1 == hash2 ➔ true #まったく同じハッシュが含まれているのでtrue hash1 == hash3 ➔ false #valueが違うのでfalse hash2 == hash3 ➔ false #valueが違うのでfalse hash1 == hash4 ➔ false #valueは同じだが、数が違うのでfalse hash2 == hash4 ➔ false #valueは同じだが、数が違うのでfalse

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

通信エラー2重投稿にあったので、削除

投稿2018/02/08 13:20

編集2018/02/08 13:21
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんな方法はいかがでしょう?

hhh.rb

ruby

1def normalize ary_of_hash 2 ary_of_hash.map(&:to_a).sort.map(&:to_h) 3end 4 5hash1 = [{"a"=> 1,"b"=> 1},{"a"=> 2,"b"=> 2}] 6hash2 = [{"a"=> 2,"b"=> 2},{"a"=> 1,"b"=> 1}] 7hash3 = [{"a"=> 1,"b"=> 3},{"a"=> 2,"b"=> 2}] 8hash4 = [{"a"=> 1,"b"=> 1},{"a"=> 2,"b"=> 2},{"a"=> 3,"b"=> 3} ] 9 10p normalize(hash1) 11p normalize(hash2) 12p normalize(hash3) 13p normalize(hash4) 14puts 15 16p normalize(hash1) == normalize(hash2) 17p normalize(hash1) == normalize(hash3) 18p normalize(hash2) == normalize(hash3) 19p normalize(hash1) == normalize(hash4) 20p normalize(hash2) == normalize(hash4) 21

実行結果

イメージ説明

hash を配列に変換し、それをソートしてから、ハッシュに戻すことで、ハッシュのキーの順番で並びかえています。後は単純に比較をするだけです。
== だけでなく < や > での大小比較も可能です。

投稿2018/02/08 13:19

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

順番の影響をなくして比較したいのなら、一定のルールで重さを付けて並び替えてしまえば良いと思います。
ごちゃっとしていて美しさはないですが、半年後にソースを見ても何しているところかわかる書き方になっているかなと

ruby

1hash1 = [{"a"=> 1,"b"=> 1},{"a"=> 2,"b"=> 2}] 2hash2 = [{"a"=> 2,"b"=> 2},{"a"=> 1,"b"=> 1}] 3hash3 = [{"a"=> 1,"b"=> 3},{"a"=> 2,"b"=> 2}] 4hash4 = [{"a"=> 1,"b"=> 1},{"a"=> 2,"b"=> 2},{"a"=> 3,"b"=> 3}] 5 6#課題 7puts hash1.sort_by{|v| v.to_s } == hash2.sort_by{|v| v.to_s } #true 8puts hash1.sort_by{|v| v.to_s } == hash3.sort_by{|v| v.to_s } #false 9puts hash2.sort_by{|v| v.to_s } == hash3.sort_by{|v| v.to_s } #false 10puts hash1.sort_by{|v| v.to_s } == hash4.sort_by{|v| v.to_s } #false 11puts hash2.sort_by{|v| v.to_s } == hash4.sort_by{|v| v.to_s } #false 12 13# 同じ値のハッシュがある場合も調べる 14hash5 = [{"a"=> 1,"b"=> 1},{"a"=> 2,"b"=> 2},{"a"=> 2,"b"=> 2}] 15hash6 = [{"a"=> 2,"b"=> 2},{"a"=> 1,"b"=> 1},{"a"=> 2,"b"=> 2}] 16 17# {"a"=> 2,"b"=> 2}の数が違うから別物と判断する 18puts hash1.sort_by{|v| v.to_s } == hash5.sort_by{|v| v.to_s } #false 19 20#被りがあっても同じ要素を持つ配列の判断はもちろんできる 21puts hash5.sort_by{|v| v.to_s } == hash6.sort_by{|v| v.to_s } #true 22 23#to_sを使っていても書き順の影響はない 24hash7 = [{"b"=> 1,"a"=> 1},{"b"=> 2,"a"=> 2}] #bから書いた 25puts hash1.sort_by{|v| v.to_s } == hash7.sort_by{|v| v.to_s } #true 26 27#to_sを使っていても型を無視したりはしない 28hash8 = [{"a"=> "1","b"=> "1"},{"a"=> "2","b"=> "2"}] #文字にしてみた 29puts hash1.sort_by{|v| v.to_s } == hash8.sort_by{|v| v.to_s } #false 30

投稿2018/02/07 16:10

oskbt

総合スコア1895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Array#&るりま)を使って、「共通要素を取った後に全部残っているかチェック」すればいいでしょう(なお、同じハッシュはない前提です)。

ruby

1hash1.length == hash2.length && hash1.length == (hash1 & hash2).length

投稿2018/02/07 11:55

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

setをつかってみました。
ただ、同じ要素がある場合、数が違っても同じになっちゃいますが。

ruby

1require 'set' 2puts hash1.to_set == hash2.to_set #=> true 3puts hash1.to_set == hash3.to_set #=> false 4puts hash2.to_set == hash3.to_set #=> false 5puts hash1.to_set == hash4.to_set #=> false 6puts hash2.to_set == hash4.to_set #=> false 7 8h1 = [{"a"=> 1,"b"=> 1},{"a"=> 2,"b"=> 2}] 9h2 = [{"a"=> 1,"b"=> 1}, {"a"=> 1,"b"=> 1}, {"a"=> 2,"b"=> 2}] 10puts h1.to_set == h2.to_set #=> true

投稿2018/02/07 13:40

y-doi

総合スコア322

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiepita1

2018/02/13 01:56

非常にわかりやすく少ないコード量だったので、こちらを参考にさせていただきました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問