首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >数组中是否包含其他数组中的任何值?

数组中是否包含其他数组中的任何值?
EN

Stack Overflow用户
提问于 2010-10-15 19:51:33
回答 5查看 62.8K关注 0票数 168

测试一个数组是否包含第二个数组中的任何元素的最有效方法是什么?

下面的两个示例试图回答以下问题:foods是否包含来自cheeses的任何元素

代码语言:javascript
复制
cheeses = %w(chedder stilton brie mozzarella feta haloumi reblochon)
foods = %w(pizza feta foods bread biscuits yoghurt bacon)

puts cheeses.collect{|c| foods.include?(c)}.include?(true)

puts (cheeses - foods).size < cheeses.size
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-15 19:55:24

代码语言:javascript
复制
(cheeses & foods).empty?

正如马克-安德烈·拉富特在评论中所说,&在线性时间内工作,而any? + include?将是二次时间。对于更大的数据集,线性时间会更快。对于较小的数据集,any? + include?可能更快,如Lee Jarvis的答案所示--可能是因为&分配了一个新的数组,而另一个解决方案没有分配新的数组,并作为一个简单的嵌套循环返回布尔值。

票数 288
EN

Stack Overflow用户

发布于 2010-10-15 19:53:52

Enumerable#any?怎么样?

代码语言:javascript
复制
>> cheeses = %w(chedder stilton brie mozzarella feta haloumi)
=> ["chedder", "stilton", "brie", "mozzarella", "feta", "haloumi"]
>> foods = %w(pizza feta foods bread biscuits yoghurt bacon)
=> ["pizza", "feta", "foods", "bread", "biscuits", "yoghurt", "bacon"]
>> foods.any? {|food| cheeses.include?(food) }
=> true

基准测试脚本:

代码语言:javascript
复制
require "benchmark"
N = 1_000_000
puts "ruby version: #{RUBY_VERSION}"

CHEESES = %w(chedder stilton brie mozzarella feta haloumi).freeze
FOODS = %w(pizza feta foods bread biscuits yoghurt bacon).freeze

Benchmark.bm(15) do |b|
  b.report("&, empty?") { N.times { (FOODS & CHEESES).empty? } }
  b.report("any?, include?") { N.times { FOODS.any? {|food| CHEESES.include?(food) } } }
end

结果:

代码语言:javascript
复制
ruby version: 2.1.9
                      user     system      total        real
&, empty?         1.170000   0.000000   1.170000 (  1.172507)
any?, include?    0.660000   0.000000   0.660000 (  0.666015)
票数 40
EN

Stack Overflow用户

发布于 2010-10-15 19:58:12

您可以检查交叉点是否为空。

代码语言:javascript
复制
cheeses = %w(chedder stilton brie mozzarella feta haloumi)
foods = %w(pizza feta foods bread biscuits yoghurt bacon)
foods & cheeses
=> ["feta"] 
(foods & cheeses).empty?
=> false
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3941945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档