代码之家  ›  专栏  ›  技术社区  ›  Tom Rossi

同步两个数组[重复]

  •  1
  • Tom Rossi  · 技术社区  · 6 年前

    我比较数组是为了同步。与

    arr1 = ['a', 'a', 'a', 'b', 'c', 'f']
    arr2 = ['a', 'b', 'b', 'c', 'd']
    

    我不知道如何同步这些数组。我必须弄清楚哪些元素需要添加到一个数组中,同时记住允许重复。我需要不同的元素 arr1 但不在 arr2 :

    ['a', 'a', 'f']
    

    arr2号 但不在 arr1号

    ['b', 'd']
    

    不幸的是,这不是 -

    arr1 - arr2 # =>  ['f']
    arr2 - arr1 # =>  ['d']
    
    4 回复  |  直到 6 年前
        1
  •  1
  •   peter    6 年前

    在这里实现 TNT's elegant solution 用于删除数组的第一个匹配元素

    class Array
      def delete_first item
        delete_at(index(item) || length)
      end
      def distinct other, own = self.dup
        other.each{|e| own.delete_first(e)}
        own
      end
    end
    
    arr1.distinct arr2 # ["a", "a", "f"]
    arr2.distinct arr1 # ["b", "d"]
    
        2
  •  0
  •   Tom Rossi    6 年前

    不漂亮!

    def array_compare(arr1, arr2)
      arr2 = arr2.clone
      add_to = []
      arr1.each do |el|
        if index = arr2.index(el)
          arr2.delete_at(index)
        else
          add_to << el
        end
      end
      return add_to
    end
    
    -> arr1 = ['a', 'a', 'a', 'b', 'c,', 'f']
    ["a", "a", "a", "b", "c,", "f"]
    
    -> arr2 = ['a', 'b', 'b', 'c,', 'd']
    ["a", "b", "b", "c,", "d"]
    
    -> array_compare(arr1, arr2)
    ["a", "a", "f"]
    
    -> array_compare(arr2, arr1)
    ["b", "d"]
    
        3
  •  0
  •   gwcodes    6 年前

    1. 计算每个数组中的所有出现次数,并存储在两个散列中
    2. 为哈希1中的每个附加计数输出数组项
    3. 扁平化和输出

    h1 = arr1.inject(Hash.new(0)) { |total, e| total[e] += 1 ;total }
    # => {"a"=>3, "b"=>1, "c"=>1, "f"=>1
    h2 = arr2.inject(Hash.new(0)) { |total, e| total[e] += 1 ;total }
    # => {"a"=>1, "b"=>2, "c"=>1, "d"=>1}
    
    h1.map { |k, v| [k] * [v - h2[k], 0].max }.flatten
    # => ["a", "a", "f"]
    h2.map { |k, v| [k] * [v - h1[k], 0].max }.flatten
    # => ["b", "d"]
    
        4
  •  0
  •   knugie    6 年前

    当允许重复时,Ruby的常规数组算法几乎没有用处。 尝试逐个删除元素:

    # Original example
    arr1 = ['a', 'a', 'a', 'b', 'c', 'f']
    arr2 = ['a', 'b', 'b', 'c', 'd']
    
    # Removing elements from arr1 that exist in arr2 ("arr1 - arr2")
    arr1wo2 = arr1.dup
    arr2.each { |val| arr1wo2.delete_at(arr1wo2.index(val) || arr1wo2.length) }
    arr1wo2  # => ["a", "a", "f"]
    
    # Removing elements from arr2 that exist in arr1 ("arr2 - arr1")
    arr2wo1 = arr2.dup
    arr1.each { |val| arr2wo1.delete_at(arr2wo1.index(val) || arr2wo1.length) }
    arr2wo1  # => ["b", "d"]
    

    希望你能帮上忙。