在Ruby中比较数组的最有效方法

下面的代码应该找到arr_1中缺少的arr_2中的arr_2

 def compare_1 (arr_1, arr_2) output = [] temp = arr_2.each_with_object(Hash.new(0)) { |val, hsh| hsh[val] = 0 } arr_1.each do |element| if !temp.has_key? (element) output << element end end puts output end def compare_2 (arr_1, arr_2) out = [] arr_1.each do |num| if (!arr_2.include?(num)) out << num end end puts out end 

根据’基准’,第一种方法更快,大概是通过使用哈希。 有没有更简洁的方法来写这些或实现这一点?

 compare_1 times: 0.000000 0.000000 0.000000 ( 0.003001) compare_2 times: 0.047000 0.000000 0.047000 ( 0.037002) 

上面的代码应该在array_1中找到array_1中缺少的数字

正如SteveTurczyn所说,你可以做array_1 - array_2

这是Array Difference的定义

返回一个新数组,该数组是原始数组的副本,删除也出现在other_ary中的所有项。 订单从原始数组中保留。

它使用hash和eql来比较元素? 效率的方法。

 [ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ] 

编辑

关于性能,我通过收集这个线程的信息做了一个基准测试 。

 ################################################ # $> ruby -v # ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin12.0] ################################################ require 'benchmark' def compare_1 arr_1, arr_2 output = [] temp = arr_2.each_with_object(Hash.new(0)) { |val, hsh| hsh[val] = 0 } arr_1.each do |element| if !temp.has_key? (element) output << element end end output end def compare_2 arr_1, arr_2 out = [] arr_1.each do |num| if (!arr_2.include?(num)) out << num end end out end require 'set' def compare_3 arr_1, arr_2 temp = Set.new arr_2 arr_1.reject { |e| temp.include? e } end def native arr_1, arr_2 arr_1 - arr_2 end a1 = (0..50000).to_a a2 = (0..49999).to_a Benchmark.bmbm(11) do |x| x.report("compare_1:") {compare_1(a1, a2)} x.report("compare_2:") {compare_2(a1, a2)} x.report("compare_3:") {compare_3(a1, a2)} x.report("native:") {native(a1, a2)} end ################################################ # $> ruby array_difference.rb # Rehearsal ----------------------------------------------- # compare_1: 0.030000 0.000000 0.030000 ( 0.031663) # compare_2: 71.300000 0.040000 71.340000 ( 71.436027) # compare_3: 0.040000 0.000000 0.040000 ( 0.042202) # native: 0.030000 0.010000 0.040000 ( 0.030908) # ------------------------------------- total: 71.450000sec # # user system total real # compare_1: 0.030000 0.000000 0.030000 ( 0.030870) # compare_2: 71.090000 0.030000 71.120000 ( 71.221141) # compare_3: 0.030000 0.000000 0.030000 ( 0.034612) # native: 0.030000 0.000000 0.030000 ( 0.030670) ################################################