【问题标题】:Comparing arrays of hashes for equality in any order以任何顺序比较哈希数组是否相等
【发布时间】:2015-09-21 15:19:43
【问题描述】:

假设我有两个由哈希组成的数组,结构类似:

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

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

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

【问题讨论】:

  • 第一部分可以很容易地处理,正如下面的基本答案所指出的那样。第二部分非常复杂,因为您尚未定义应归类为差异的内容。如果名称相同但家庭不同,则这是不同的,但是您要显示什么。您希望展示什么样的差异以及如何展示?更好地了解您如何处理这些信息将非常有益

标签: arrays ruby hash compare


【解决方案1】:
diff = (array1 - array2) + (array2 - array1)
equality = diff.empty?

【讨论】:

  • 很好,但是由于 OP 想知道差异,您可以写 in_1_not_2 = array1 - array2; in_2_not_1 = array2 - array1; equality = in_1_not_2.empty? && in_2_not_1.empty?
  • @CarySwoveland 是的,“差异”是模糊的,我不知道 OP 问了什么样的差异:)
【解决方案2】:
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 快得多,但这并没有考虑到创建这两个集合的开销。总的来说,我不知道是使用集合更快还是简单地使用数组差异。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多