5

我有两个数组

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)
4

3 回答 3

5

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

于 2013-10-04T20:15:35.197 回答
2

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

uniques = ordered - some_list
duplicates = ordered - uniques

订单将被保留。

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

于 2013-10-05T13:29:16.640 回答
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)
于 2013-10-04T20:16:22.107 回答