样本数组:
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]
?
答案 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
),整个调用的结果将包括块返回的所有元素真实的价值。