样本数组:
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]
?
怎么样:
x - (x - y)
#=> [2, 4, 2, 2, 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 次操作。
首先,不要在 Ruby 中大写变量。大写用于常量,如类名。
result = x.select {|i| y.include? i}
请注意,select
它也称为find_all
, 并且是 ruby 中的正过滤器;负过滤器是reject
。在大括号之间你可以放任何你想要的代码;它将为 的每个项目运行一次x
(该项目作为参数传入并变为i
),整个调用的结果将包括该块为其返回真值的所有元素。