比较两个数组并删除唯一值

时间:2013-10-04 20:13:05

标签: ruby arrays performance

我有两个数组

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)

3 个答案:

答案 0 :(得分:4)

试试这个new_arry = order­ed & some_­list

答案 1 :(得分:2)

也可以通过以下方式完成:

uniques = ordered - some_list
duplicates = ordered - uniques

订单将被保留。

参考:http://ruby-doc.org/core-2.0.0/Array.html#method-i-2D

答案 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)