如何过滤数组中的元素?

时间:2013-05-10 23:05:39

标签: ruby arrays

样本数组:

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]

3 个答案:

答案 0 :(得分:4)

怎么样:

x - (x - y)
#=> [2, 4, 2, 2, 2]

答案 1 :(得分:2)

比@ Mark的答案长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次操作。

答案 2 :(得分:1)

首先,不要在Ruby中大写变量。大写是指常量,如类名。

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

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