• ベストアンサー

配列に複数の値があるか簡潔に判断する方法

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) という具合に、短く書く方法があれば ご教授お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

この場合はArray#-が単純で良いと思います。 ([3, 4] - hairetu).empty?

hourensan
質問者

お礼

MillenniuM 様 回答ありがとうございます。 とてもシンプルで、分かりやすいので これを利用させて頂こうと思います。 配列の引き算が出来るのは初めて知りました。 引き算を利用した、素晴らしい発想だと思いました。 お忙しい中、ありがとうございました。

その他の回答 (4)

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.5

# ANo4さんへ おぉなるほど、集合演算でも「-」を使うと今回のケースが綺麗に解決できるんですね・・・思いつきませんでした。 合致判定を Array#include? に依らないのであれば、これがスマートだと思います。 Array#include? は「==」に依存しますが、Array#-は「eql?」に依存する為、動きが異なります。 組み込みクラスでわかりやすいのはFloatが混じった時でしょうか。 http://codepad.org/fqyFSGRK

hourensan
質問者

お礼

sholmes様 補足説明ありがとうございます。 小数点がある場合は、注意が必要なのですね。 大変参考になりました。 お忙しい中、ありがとうございました。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.3

重複をどう扱いたいかわからんけど、何も考えない策としては sub = [1, 1, 3] sup = [4, 3, 1, 2, 1] sup.permutation(sub.size).include?(sub) とか。

hourensan
質問者

お礼

koko_u_u様 回答ありがとうございます。 大変参考になりました。 お忙しい中、ありがとうございました。

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.2

そのまま実現している組み込みメソッドは、ちょっと思い当たりませんでした。 自分なら多分、 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] 最後に要素数のチェックを入れた方が良いかもしれません。

hourensan
質問者

お礼

sholmes様 回答ありがとうございます。 見た目的にシンプルになりますが 回答NO.4の配列の引き算を利用した方が 分かりやすい気がしましたので そちらを使わせて頂こうと思います。 しかしながら、この方法も 準備さえしておけば、便利使えると思いますので 何かに応用させて頂こうと思います。 ありがとうございました。

回答No.1

ご教示… @ary1 & @ary2 で共通要素が取り出されます。 unless (@ary1 & @ary2).empty? などのようにしてみてはいかがでしょうか。 unlessが嫌なら if (@ary1 & @ary2).size > 0

hourensan
質問者

お礼

Ma-yan_bh1011様 回答ありがとうございます。 大変参考になりました。 お忙しい中、ありがとうございました。

関連するQ&A

専門家に質問してみよう