- ベストアンサー
配列に複数の値があるか簡潔に判断する方法
hairetu = [1,2,3,4,5] という配列があった時 3と4が含まれているかを判断するには if hairetu.include?(3) && hairetu.include?(4) p "3と4が含まれている" end と書けばよいのですが 条件が増えたら、見にくくなってしまいます。 そういった理由で if hairetu.include?(3,4) や if hairetu.include?(3 or 4) という具合に、短く書く方法があれば ご教授お願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
この場合はArray#-が単純で良いと思います。 ([3, 4] - hairetu).empty?
その他の回答 (4)
- sholmes
- ベストアンサー率81% (89/109)
# ANo4さんへ おぉなるほど、集合演算でも「-」を使うと今回のケースが綺麗に解決できるんですね・・・思いつきませんでした。 合致判定を Array#include? に依らないのであれば、これがスマートだと思います。 Array#include? は「==」に依存しますが、Array#-は「eql?」に依存する為、動きが異なります。 組み込みクラスでわかりやすいのはFloatが混じった時でしょうか。 http://codepad.org/fqyFSGRK
お礼
sholmes様 補足説明ありがとうございます。 小数点がある場合は、注意が必要なのですね。 大変参考になりました。 お忙しい中、ありがとうございました。
- koko_u_u
- ベストアンサー率18% (216/1139)
重複をどう扱いたいかわからんけど、何も考えない策としては sub = [1, 1, 3] sup = [4, 3, 1, 2, 1] sup.permutation(sub.size).include?(sub) とか。
お礼
koko_u_u様 回答ありがとうございます。 大変参考になりました。 お忙しい中、ありがとうございました。
- sholmes
- ベストアンサー率81% (89/109)
そのまま実現している組み込みメソッドは、ちょっと思い当たりませんでした。 自分なら多分、 Enumerable#all? を使ってこんな感じの対処をするかなとは思います。 https://ideone.com/o1plX <おまけ> ANo.1さんへ 集合演算とempty?やany?だけだと、こんな感じの時に困りませんか? # OK p [3, 4] & [1, 2, 3, 4, 5] p [3, 4] & [1, 2, 5] # NG p [3, 4] & [1, 2, 3, 5] 最後に要素数のチェックを入れた方が良いかもしれません。
お礼
sholmes様 回答ありがとうございます。 見た目的にシンプルになりますが 回答NO.4の配列の引き算を利用した方が 分かりやすい気がしましたので そちらを使わせて頂こうと思います。 しかしながら、この方法も 準備さえしておけば、便利使えると思いますので 何かに応用させて頂こうと思います。 ありがとうございました。
- ・真 綾・(@Ma-yan_bh1011)
- ベストアンサー率30% (79/257)
ご教示… @ary1 & @ary2 で共通要素が取り出されます。 unless (@ary1 & @ary2).empty? などのようにしてみてはいかがでしょうか。 unlessが嫌なら if (@ary1 & @ary2).size > 0
お礼
Ma-yan_bh1011様 回答ありがとうございます。 大変参考になりました。 お忙しい中、ありがとうございました。
お礼
MillenniuM 様 回答ありがとうございます。 とてもシンプルで、分かりやすいので これを利用させて頂こうと思います。 配列の引き算が出来るのは初めて知りました。 引き算を利用した、素晴らしい発想だと思いました。 お忙しい中、ありがとうございました。