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

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)
3个回答

5

Try this new_arry = order­ed & some_­list


这是非常简洁的语法,但与他的循环相比,它是否被提升为优化代码,还是最终速度相当,但打字更好看? - Tetsujin no Oni
我正在运行基准测试来比较这两个,就在我说话的同时... - thank_you
1
我更新了代码为 new_array = ordered & some_list,因此它会保留在 ordered 数组中定义的顺序。新数组中元素的顺序取决于第一个数组。 - Iuri G.
1
@TetsujinnoOni 你需要阅读 Ruby 文档才能找到答案 http://ruby-doc.org/core-2.0.0/Array.html#method-i-26 。这是一个内置函数,我敢打赌它比 Jason 运行的循环次数要优化得多。 - Raghu
@luri G 谢谢你帮我重构 :) - Raghu
显示剩余5条评论

2

1
ordered.select{|i| some_list.include?(i)}

编辑:

不太确定


这不就是他第二个循环的简写吗?相比之下,选择是否有显著优化?(我不是 Ruby 的人) - Tetsujin no Oni
是的,我刚刚意识到结果很微小。嗯,我会给他信用,因为他比你先回答了。我喜欢你使用了select,我没有想到。 - thank_you
2
我运行了基准测试,如果你比较大的字符串数组并且它们是反向排序的(这样对于CPU来说更难匹配),那么你会得到数量级差异的速度。&selectinclude 快 30 倍。 - Iuri G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接