同步两个阵列



我正在比较数组以进行同步。随着

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']

这里是TNT删除数组第一个匹配元素的优雅解决方案的实现

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"]

它不漂亮!

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"]

这里有一种方法:

  1. 计算每个数组中的所有出现次数,并存储在 2 个哈希中
  2. 循环访问哈希 1 并将每个计数与哈希 2 进行比较
  3. 为哈希 1 中的每个额外计数输出一个数组项
  4. 展平和输出

实现:

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"]

当允许重复时,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"]

我希望你觉得有帮助。

最新更新