0

私は次の2つの配列を持っています

a= [1,2,3,4]
b= [1,2]
c= [1,2,3,4,5]

次のようなブール値を返すメソッドが必要です

a.<some_method>(b) #should return true 
b.<some_method>(c) #should return false

include?他の配列の要素としてbを期待しているため、使用しても機能しないと仮定します

現在、私は次のようなことをしています

b.all?{|x| a.include?(x) }

私の両方のアレイが長い長さを持っているので、もっと良い/速い方法があるか知りたいです

4

6 に答える 6

9

最初の配列から2番目の配列を引いた結果を確認するだけです。

あなたの場合、B-Aは空になりますが、C-Aは空ではありません...

于 2012-10-09T08:10:58.440 に答える
6

最も単純なケースでは、配列操作は適切です。

しかし、大規模なケースでは、セット操作が必要だと思います。http://www.ruby-doc.org/stdlib-1.9.3/libdoc/set/rdoc/Set.htmlをご覧ください。

あなたの場合のように、それは

a= [1,2,3,4].to_set
b= [1,2].to_set
c= [1,2,3,4,5].to_set

a.superset?(b)   # -> true
b.superset?(c)   # -> false
于 2012-10-09T08:17:58.243 に答える
4

array&other_arrayは、配列と他の配列の間で一致する要素を返し、重複を削除します。ブールテストを作成して、1つの配列の一意の要素を、2つの結合された配列の交差する要素と比較することにより、1つの配列のすべての要素が別の配列にあるかどうかを確認できます。

a = [1,2,3,4,5]
b = [2,3,4,5]
c = [4,5,6,7]

# check if all items in one array are in another array

def all_items_in_array?(original_array, test_array)
    test_array.uniq == original_array & test_array
end

このメソッドはブール値を返します

all_items_in_array?(a,b) # true
all_items_in_array?(a,c) # false
all_items_in_array?(b,c) # false

重複を伴うブールチェックの場合

def all_items_including_duplicates_in_array?(original_array, test_array)
    original_grouped = original_array.group_by{|item| item}.values
    test_grouped = test_array.group_by{|item| item}.values
    test_grouped == original_grouped & test_grouped
end
于 2014-05-15T04:40:17.343 に答える
1

配列の違いとSet#subsetの両方?答えはいいですが、OPは特に速度について尋ねました。パフォーマンスの質問に答える最良の方法は、実際にさまざまなアプローチの時間を計ることです。救助へのベンチマーク:

require 'benchmark'
require 'set'

BIG = 10_000
N = 1_000_000
SLOW_N = 500

a = [1,2,3,4]
b = [1,2]
c = [1,2,3,4,5]

bigA = (1..BIG).to_a
bigB = bigA.dup
bigB.pop
bigC = bigA.dup << (BIG+1)

setA = a.to_set
setB = b.to_set
setC = c.to_set
bigsetA = bigA.to_set
bigsetB = bigB.to_set
bigsetC = bigC.to_set

puts RUBY_DESCRIPTION
Benchmark.bm(21) do |x|
  x.report('Array#-')     { N.times{ (b-a).empty?; (c-a).empty? } }
  x.report('Set#subset?') { N.times{ setB.subset?(setA); setC.subset?(setA) } }
  x.report('big Array#-')     { SLOW_N.times{ (bigB-bigA).empty?; (bigC-bigA).empty? } }
  x.report('big Set#subset?') { SLOW_N.times{ bigsetB.subset?(bigsetA); bigsetC.subset?(bigsetA) } }
  x.report('big all? Set#include?')  { SLOW_N.times{ bigB.all?{|x| bigsetA.include?(x)}; bigC.all?{|x| bigsetA.include?(x)} } }
end

結果は、小さなセットの場合、有意差がないことを示しています。大きなもののSet#subset?場合、約20%高速です。

ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-linux]
                            user     system      total        real
Array#-                 1.520000   0.000000   1.520000 (  1.518501)
Set#subset?             1.520000   0.000000   1.520000 (  1.533306)
big Array#-             2.180000   0.000000   2.180000 (  2.180390)
big Set#subset?         1.720000   0.000000   1.720000 (  1.724991)
big all? Set#include?   2.130000   0.000000   2.130000 (  2.142015)
于 2012-10-09T09:03:08.903 に答える
0
arr = [a, b, c]
arr.reduce(:&)

一貫した要素を取得します

私も一貫性のないものを追いかけています。

于 2018-04-10T11:40:31.550 に答える
-1

これを行うこともできます:

a = [1,2,3]
b = [2,4,6]
c = [2,3,4]

(a & b).any? or (a & b & c).any?
于 2012-10-09T08:20:35.580 に答える