Ruby

【Ruby】2つの配列を比較し、重複を取り除いた結果を出力する方法【実は超簡単!】

バートリーのさいとうです。

今回は

2つの配列から重複を取り除き、その結果を出力する方法

について解説していきたいと思います。

早速結論=マイナスを使う

先にお伝えしておくと、やること自体は実はめちゃめちゃ簡単です。

先に結論を言いたいと思います。

array_one = [1, 2, 3]
array_two = [1, 2]
p array_one - array_two
# →3

これで、重複を取り除くことができました。

使ったのは、-(マイナス)だけです。

これは、ruby リファレンスマニュアルの以下のページに記載されています。

一見難しそうですが、マニュアルを読めば書いてあることもあるものですね。

逆に重複している値を残すには?

これも、リファレンスマニュアルに記載があります。

array_one = [1, 2, 3]
array_two = [1, 2]
p array_one & array_two
# →[1, 2]

これも簡単ですね。&を使うだけでした。

もし、引かれる側に引く値が存在しなかったら?

ドヤ顔でこのことを、同期の人に説明すると

「引く側の配列に元の配列の値が含まれてないとどうなるのかな?

という鋭い疑問をいただいたので、その答えも実例を踏まえてお伝えしようと思います。

具体的には、以下のような場面を想定します。

array_one = [1, 2, 3]
array_two = [1, 2, 5]
p array_one - array_two

この場合どうなるでしょうか?

少し考えて見てください。

答えはこうです。

array_one = [1, 2, 3]
array_two = [1, 2, 5]
p array_one - array_two
# →3

なぜこうなるか、パッとわかりますか?

これは、以下のような例を考えるとわかりやすいです。

strings_one = ["apple", "grape" , "banana"]
strings_two = ["apple", "grape", "バナナ"]
p strings_one - strings_two
# →["banana"]

はい、このようになりました。

つまり

-(マイナス)は「引かれる側の配列内の値に完全に一致しているものだけを排除する」という機能を持っていると考えることができます。

(引かれる側の)array_oneとかstrings_oneにない値のことは知らねーよ!ってことです。

ちなみに、「完全に一致しているもの」と言える根拠、先ほどのリファレンスの以下の部分

要素の同一性は Object#eql? により評価されます。

から、理解することができます。

更に深堀りたい方はリファレンスを参考にしてみてください。

ざっくり理解するなら、「完全に一致しているもの」という理解で良いと思います。

まとめ

いかがだったでしょうか。

今回は、2つの配列から重複を取り除いた結果を出力する方法について解説しました。

リファレンスマニュアル読めば全てがわかるって本当なんですね。

このように、週に1回~2回、Ruby, Ruby on Railsを中心に技術ブログを更新しています。

もし参考になったなと思ったら、ブックマークをお願い致します。

最後まで読んでいただき、ありがとうございました!

それでは。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA