2013-05-10 86 views
3

样本数组:如何过滤数组中的元素?

x = [1,2,3,4,2,2,2] 

筛选:

y = [2,4,7,9] 

所需的输出:

result = [2,4,2,2,2] 

我想:

result = (x & y) 

,但是这给了我[4,2]

我该如何获得:result = [2,4,2,2,2]

+2

怎么样在'x'第2? – squiguy 2013-05-10 23:20:05

+0

他固定它,看起来像一个错字。另外,近距离投票是什么? – nzifnab 2013-05-10 23:54:19

回答

1

首先,不要在Ruby中使变量大写。大写字母用于常量,如类名。

result = x.select {|i| y.include? i} 

注意select也被称为find_all,并且是在红宝石的正滤波器;负滤波器是reject。在大括号之间你可以放任何你想要的代码;它将为每个项目x(该项目作为参数传入并且变为i)运行一次,并且整个调用的结果将包括该块返回真值的所有元素。

+0

谢谢!我也会改变大小写! – gkolan 2013-05-10 23:12:40

2

1-2线比@马克的回答更长,但更有效(如果两个数组都是大):

require 'set' 
keep = Set[2,4,7,9] # or Set.new(some_large_array) 
result = x.select{ |n| keep.include?(n) } #=> [2, 4, 2, 2, 2] 

写作的问题...

x.select{ |i| y.include?(i) } 

...是这是O(x * y)每个数组中元素的数量。在最坏的情况下,每个元素都有100个元素进行10,000次操作;我的答案只有100个操作。

+1

不成熟的优化是万恶之源!但是,把'y'变成一个Set可以帮助表演。另外,我认为例子中结果的排序是巧合的。它具有与输入列表中相同顺序的元素。 – 2013-05-10 23:18:00

+1

另外:恕我直言了解算法的复杂性和选择一个没有潜在灾难性的并不相同的过早优化。这只是很好的编码。在我为你工作的大型软件公司,会惊讶于我们在代码中找到了多少O(n^3)算法,这些算法都是在几年前由实习生安置的。当产品用于稍大的数据集时,这些代码最终会导致完全不能接受的性能问题。 – Phrogz 2013-05-10 23:25:02

+2

嗯,我看到过多复杂性导致的更多生产问题(其中一些是由您真正引入的),而不是差的算法选择。在这种情况下,即使是小列表,使用Set也可能没有任何缺点,但在某些类似的情况下,为使得更有效的算法成为可能,设置所需的开销很容易超过收益。这就是为什么了解您的数据域和交易量非常重要,这就是“过早”部分出现的地方。:) – 2013-05-10 23:30:24