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]

4

3 回答 3

4

怎么样:

x - (x - y)
#=> [2, 4, 2, 2, 2]
于 2013-05-11T02:25:56.797 回答
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 次操作。

于 2013-05-10T23:14:41.927 回答
1

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

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

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

于 2013-05-10T23:11:01.653 回答