rubyの配列と配列の比較について質問させてください。
array1 = ["a","b","c","d","e","f"]
array2 = ["b","d","e"]
array1にarray2が全て含まれている場合に、trueを返す条件式でいい記述方法がありましたら教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
(array2 - array1).empty?
ですかね。
投稿2016/02/05 14:22
総合スコア84499
0
順番や重複を無視するのであれば、集合(Set)にして、Set#subset?
やSet#superset?
を使うという方法もあります。参考までにどうぞ。
Ruby
1require "set" 2array1 = ["a","b","c","d","e","f"] 3array2 = ["b","d","e"] 4set1 = Set.new(array1) 5set2 = Set.new(array2) 6p set1.subset?(set2) # => false 7p set2.subset?(set1) # => true 8p set1.superset?(set2) # => true 9p set2.superset?(set1) # => false
投稿2016/02/07 12:34
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
すでにベストアンサーがでますが、別案を示します。(すこし冗長です)
ruby
1def check_include(array1, array2) 2 array2.each do |x| 3 idx = array1.index(x) 4 return false unless idx 5 array1.delete_at(idx) 6 end 7 true 8end
次のプログラムで動作を確認しています。
ここで示した方法では、array2 に要素の重複があった場合の挙動が (array2 - array1).empty? とは異なります。
ruby
1def check(array1, array2) 2 puts "array1 = #{array1}" 3 puts "array2 = #{array2}" 4 # puts "array2 - array1 = #{array2 - array1}" 5 puts "(array2 - array1).empty? -> #{(array2 - array1).empty?}" 6 puts "check_indlude = #{check_include(array1, array2)}" 7 puts 8end 9 10def check_include(array1, array2) 11 array2.each do |x| 12 idx = array1.index(x) 13 return false unless idx 14 array1.delete_at(idx) 15 end 16 true 17end 18 19array1 = ['a', 'b', 'c', 'd', 'e', 'f'] 20array2 = ['e', 'd', 'b'] 21check(array1, array2) 22 23array2 << 'x' 24check(array1, array2) 25 26array1 = ['a', 'b'] 27array2 = ['x', 'b'] 28check(array1, array2) 29 30array1 = ['a', 'b', 'c', 'b'] 31array2 = ['b', 'a'] 32check(array1, array2) 33 34array1 = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'] 35array2 = ['b', 'a', 'd', 'a'] 36check(array1, array2) 37 38array1 = [1, 2, 3, 4] 39array2 = [1, 1, 1] 40check(array1, array2) 41 42array1 = [1, 2, 3, 4, 1, 1] 43array2 = [1, 1, 1] 44check(array1, array2)
実行結果
array1 = ["a", "b", "c", "d", "e", "f"] array2 = ["e", "d", "b"] (array2 - array1).empty? -> true check_indlude = true array1 = ["a", "c", "f"] array2 = ["e", "d", "b", "x"] (array2 - array1).empty? -> false check_indlude = false array1 = ["a", "b"] array2 = ["x", "b"] (array2 - array1).empty? -> false check_indlude = false array1 = ["a", "b", "c", "b"] array2 = ["b", "a"] (array2 - array1).empty? -> true check_indlude = true array1 = ["a", "b", "c", "d", "a", "b", "c", "d"] array2 = ["b", "a", "d", "a"] (array2 - array1).empty? -> true check_indlude = true array1 = [1, 2, 3, 4] array2 = [1, 1, 1] (array2 - array1).empty? -> true check_indlude = false array1 = [1, 2, 3, 4, 1, 1] array2 = [1, 1, 1] (array2 - array1).empty? -> true check_indlude = true
投稿2016/02/06 00:45
編集2016/02/07 12:08総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/05 14:46