我有两个数组
ordered = [1, 2, 3, 4, 5]
some_list = [2, 6, 4]
我想比较两个数组,然后找到重复数据,并将其形成一个新数组。诀窍是按照ordered
数组中提供的顺序保持数组。
new_array = [2, 4] # Result should be this
我已经考虑过一种方法,但我认为性能可以提高。
ordered.each do |value1|
some_list.include? value1
new_array << value1
end
end
有什么方法可以改善这个吗?
基准测试结果
user system total real
using & 0.210000 0.000000 0.210000 ( 0.212070)
using select 0.220000 0.000000 0.220000 ( 0.218889)
答案 0 :(得分:4)
试试这个new_arry = ordered & some_list
答案 1 :(得分:2)
也可以通过以下方式完成:
uniques = ordered - some_list
duplicates = ordered - uniques
订单将被保留。
答案 2 :(得分:1)
ordered.select{|i| some_list.include?(i)}
编辑:
不确定select是否针对性能进行了优化,但它是作为OP提供的代码的更短且更清晰的替代方式。
快速基准测试给出了这样的结果: 编辑:添加接受的答案替代。
user system total real
each 0.000000 0.000000 0.000000 ( 0.000005)
select 0.000000 0.000000 0.000000 ( 0.000004)
& 0.000000 0.000000 0.000000 ( 0.000005)