Ruby:如何找到两个数组的相似性
Ruby: How to find to similarity in two arrays
我正在尝试查找两个数组中的公共元素。
pairs = Array.new
a = exchange_one.get_symbols
b = exchange_two.get_symbols
c = a+b
c.uniq{|pair| pairs << pair}
我正在使用 +
组合两个数组
然后我调用 uniq 来删除重复项,但将其传递给一个块,以便找到的重复项可以在删除之前添加到数组中。
出于某种原因,数组对就是整个 c 数组。
查找数组相似性的正确方法是什么。
如果您的目标只是确定两个数组之间哪些元素相同,您可以使用交集运算符 Array#&
.
a = exchange_one.get_symbols
b = exchange_two.get_symbols
intersection = a & b
假设:
arr1 = 15.times.map { rand 6 }
#=> [1, 0, 4, 0, 2, 3, 1, 0, 2, 4, 4, 1, 3, 1, 1]
arr2 = 15.times.map { rand 6 }
#=> [5, 5, 4, 1, 5, 1, 5, 0, 4, 0, 2, 0, 4, 5, 0]
arr1
包含 5
1
,arr2
包含 2
1
。如果通过 "common elements",您希望报告两个数组都包含 [5, 2].min #=> 2
1
,并且任一数组中出现的其他元素的计数相似,您可以执行以下操作:
h1 = count(arr1)
#=> {1=>5, 0=>3, 4=>3, 2=>2, 3=>2}
h2 = count(arr2)
#=> {5=>5, 4=>3, 1=>2, 0=>4, 2=>1}
(h1.keys | h2.keys).each_with_object({}) { |k,h| h[k] = [h1[k], h2[k]].min }
#=> {1=>2, 0=>3, 4=>3, 2=>1, 3=>0, 5=>0}
def count(arr)
arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }
end
首先要明白自己在做什么,想要什么。
例如
a = 15.times.map { rand 6 }
#=> [1, 0, 5, 3, 1, 3, 4, 1, 3, 2, 1, 2, 4, 2, 3]
b = 15.times.map { rand 6 }
#=> [3, 3, 3, 1, 3, 1, 3, 1, 5, 1, 4, 2, 0, 0, 4]
你现在在做什么
c = a + b
#=> [1, 0, 5, 3, 1, 3, 4, 1, 3, 2, 1, 2, 4, 2, 3, 3, 3, 3, 1, 3, 1, 3, 1, 5, 1, 4, 2, 0, 0, 4]
c - 仅组合数组而不考虑内容,因此获取所有值。
现在
pairs = Array.new
c.uniq{|pair| pairs << pair}
这里 uniq 只是作为一个迭代器意味着如果你检查 'pair' 然后它迭代所有 'c' 的值并将这些值插入 'pairs'数组。
检查这个
c.uniq{|pair| puts pair}
这就是为什么您要获取 'pairs' 数组中的所有值。
在数组中查找相似性的最佳方法是 (a&b)
,但您可以按如下方式更改代码以实现它。
pairs = (arr1+arr2).uniq
OR
pairs = arr1 & arr2 #best and efficient way.
我正在尝试查找两个数组中的公共元素。
pairs = Array.new
a = exchange_one.get_symbols
b = exchange_two.get_symbols
c = a+b
c.uniq{|pair| pairs << pair}
我正在使用 +
组合两个数组然后我调用 uniq 来删除重复项,但将其传递给一个块,以便找到的重复项可以在删除之前添加到数组中。
出于某种原因,数组对就是整个 c 数组。
查找数组相似性的正确方法是什么。
如果您的目标只是确定两个数组之间哪些元素相同,您可以使用交集运算符 Array#&
.
a = exchange_one.get_symbols
b = exchange_two.get_symbols
intersection = a & b
假设:
arr1 = 15.times.map { rand 6 }
#=> [1, 0, 4, 0, 2, 3, 1, 0, 2, 4, 4, 1, 3, 1, 1]
arr2 = 15.times.map { rand 6 }
#=> [5, 5, 4, 1, 5, 1, 5, 0, 4, 0, 2, 0, 4, 5, 0]
arr1
包含 5
1
,arr2
包含 2
1
。如果通过 "common elements",您希望报告两个数组都包含 [5, 2].min #=> 2
1
,并且任一数组中出现的其他元素的计数相似,您可以执行以下操作:
h1 = count(arr1)
#=> {1=>5, 0=>3, 4=>3, 2=>2, 3=>2}
h2 = count(arr2)
#=> {5=>5, 4=>3, 1=>2, 0=>4, 2=>1}
(h1.keys | h2.keys).each_with_object({}) { |k,h| h[k] = [h1[k], h2[k]].min }
#=> {1=>2, 0=>3, 4=>3, 2=>1, 3=>0, 5=>0}
def count(arr)
arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }
end
首先要明白自己在做什么,想要什么。
例如
a = 15.times.map { rand 6 }
#=> [1, 0, 5, 3, 1, 3, 4, 1, 3, 2, 1, 2, 4, 2, 3]
b = 15.times.map { rand 6 }
#=> [3, 3, 3, 1, 3, 1, 3, 1, 5, 1, 4, 2, 0, 0, 4]
你现在在做什么
c = a + b
#=> [1, 0, 5, 3, 1, 3, 4, 1, 3, 2, 1, 2, 4, 2, 3, 3, 3, 3, 1, 3, 1, 3, 1, 5, 1, 4, 2, 0, 0, 4]
c - 仅组合数组而不考虑内容,因此获取所有值。
现在
pairs = Array.new
c.uniq{|pair| pairs << pair}
这里 uniq 只是作为一个迭代器意味着如果你检查 'pair' 然后它迭代所有 'c' 的值并将这些值插入 'pairs'数组。
检查这个
c.uniq{|pair| puts pair}
这就是为什么您要获取 'pairs' 数组中的所有值。
在数组中查找相似性的最佳方法是 (a&b)
,但您可以按如下方式更改代码以实现它。
pairs = (arr1+arr2).uniq
OR
pairs = arr1 & arr2 #best and efficient way.