比较Ruby

时间:2015-09-21 15:19:44

标签: arrays ruby hash compare

让我们说我有两个由哈希组成的数组,结构类似:

array = [{:name => "John", 
            :surname => "Smith", 
            :family => {:mom => "Cathy", 
                        :father => "Joe"} 
         },{:name => "Kevin", 
            :surname => "Smith", 
            :family => {:mom => "Jessica", 
                        :father => "Bob"} 
         }]

如果这两个数组在数组中都有大约10000个元素/人(哈希),那么比较两个数组的最佳和最快的方法是什么?

第二个数组中的哈希值可能与第一个数组中的哈希值不同,但如果元素相同则数组相等。 此外,比较应该能够找出差异(如果有的话),不仅表明它们不相等。

提前致谢

2 个答案:

答案 0 :(得分:3)

diff = (array1 - array2) + (array2 - array1)
equality = diff.empty?

答案 1 :(得分:0)

require 'set'

def compare(array1, array2)        
  s1, s2 = array1.to_set, array2.to_set   
  if (s1 == s2)
    puts "arrays are equal"
  else
    puts "elements in array1 not in array 2: #{(s1-s2).to_a}" unless (s1-s2).empty?
    puts "elements in array2 not in array 1: #{(s2-s1).to_a}" unless (s2-s1).empty?
  end
end

a1 = [{ a: 1, b: 2 }, { b: 1, a: 2 }]
a2 = [{ a: 2, b: 1 }, { b: 2, a: 1 }]
a3 = [{ a: 2, b: 1 }, { b: 0, a: 1 }]

compare(a1, a2)
  #=> arrays are equal
compare(a1, a3)
  #=> elements in array1 not in array 2: [{:a=>1, :b=>2}]
  #=> elements in array2 not in array 1: [{:b=>0, :a=>1}]

(s1-s2).to_a(s2-s1).to_aarray1-array2array2-array1快得多,但这并不能解释创建这两套的开销。总的来说,我不知道使用集合或使用数组差异是否更快。