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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

5280閲覧

ruby 配列と配列の比較

suttannki317

総合スコア26

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

2クリップ

投稿2016/02/05 14:02

rubyの配列と配列の比較について質問させてください。
array1 = ["a","b","c","d","e","f"]
array2 = ["b","d","e"]

array1にarray2が全て含まれている場合に、trueを返す条件式でいい記述方法がありましたら教えてください。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

(array2 - array1).empty?ですかね。

投稿2016/02/05 14:22

otn

総合スコア84499

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

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

suttannki317

2016/02/05 14:46

回答ありがとうございます。 (array2 - array1)ですか! 思いつきませんでした!勉強になります!
guest

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

raccy

総合スコア21735

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

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

suttannki317

2016/02/09 08:56

回答いただきありがとうございます。 なるほどー、Setを使う方法もあるのですね! 全く使ったことがなかったので、とても参考になりました!
guest

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
katoy

総合スコア22324

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

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

suttannki317

2016/02/07 06:02

回答いただきありがとうございました! 重複がある場合に、実行結果が異なるのですね! 丁寧なご回答をいただき感謝です、参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問