比较任意顺序的哈希数组是否相等



假设我有两个由散列组成的数组,结构类似如下:

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

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

第二个数组中的哈希值可能与第一个数组中的哈希值顺序不同,但如果元素相同,则两个数组相等。此外,比较应该能够找到差异(如果有的话),而不仅仅是显示它们不相等。

diff = (array1 - array2) + (array2 - array1)
equality = diff.empty?
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快得多,但这并不能解释创建两个集合的开销。总的来说,我不知道是使用集合更快还是简单地使用数组差异更快。

相关内容

最新更新