Ruby:如何在两个数组中查找相似度

时间:2019-05-08 00:55:25

标签: arrays ruby uniq

我试图在两个数组中找到共同的元素。

pairs = Array.new
a = exchange_one.get_symbols
b = exchange_two.get_symbols
c = a+b
c.uniq{|pair| pairs << pair}

我正在使用 +

组合两个数组

然后我打电话给 uniq 删除重复项,但将其传递到块中,以便找到的重复项可以在删除之前添加到数组中。

由于某种原因,数组对只是整个 c 数组。

找到数组相似性的正确方法是什么。

3 个答案:

答案 0 :(得分:6)

如果您的目标只是确定两个数组之间的元素相同,则可以使用交集运算符Array#&

a = exchange_one.get_symbols
b = exchange_two.get_symbols

intersection = a & b

答案 1 :(得分:2)

首先了解您在做什么和想要什么。

例如。

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}

这就是为什么要在“对”数组中获取所有值的原因。

在数组中查找相似性的最佳方法是(a&b),但您可以按照以下步骤对代码进行更改以实现相似性。

 pairs = (arr1+arr2).uniq

OR

 pairs = arr1 & arr2 #best and efficient way.

答案 2 :(得分:1)

假设:

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 s,而arr2包含2 1 s。如果要通过“公共元素”报告两个数组都包含[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