Arrays Ruby:如何在两个数组中找到相似性

Arrays Ruby:如何在两个数组中找到相似性,arrays,ruby,uniq,Arrays,Ruby,Uniq,我试图在两个数组中找到公共元素 pairs = Array.new a = exchange_one.get_symbols b = exchange_two.get_symbols c = a+b c.uniq{|pair| pairs << pair} pairs=Array.new a=交换一个。获取符号 b=交换两个。获取两个符号 c=a+b c、 uniq{| pair | pairs如果您的目标只是确定两个数组之间哪些元素相同,那么可以使用交集操作符 如果您的目标只是确

我试图在两个数组中找到公共元素

pairs = Array.new
a = exchange_one.get_symbols
b = exchange_two.get_symbols
c = a+b
c.uniq{|pair| pairs << pair}
pairs=Array.new
a=交换一个。获取符号
b=交换两个。获取两个符号
c=a+b

c、 uniq{| pair | pairs如果您的目标只是确定两个数组之间哪些元素相同,那么可以使用交集操作符


如果您的目标只是确定两个阵列之间的哪些元素相同,则可以使用交集操作符

假设:

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]。最小值#=>2
1
s,以及出现在任一数组中的其他元素的类似计数,则可以执行以下操作:

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
假设:

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]。最小值#=>2
1
s,以及出现在任一数组中的其他元素的类似计数,则可以执行以下操作:

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”数组中的所有值

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

 pairs = (arr1+arr2).uniq

OR

 pairs = arr1 & arr2 #best and efficient way.


首先了解你在做什么,你想要什么

例如

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”数组中的所有值

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

 pairs = (arr1+arr2).uniq

OR

 pairs = arr1 & arr2 #best and efficient way.


[1,1,2]
[1,3,1]
中的公共元素是什么?一个
1
或两个?如果
1
就是
arr1和arr2
[1,1,2]
[1,3,1]中的公共元素是什么
?一个
1
或两个?如果
1
就是
arr1&arr2
。请注意,将两个数组相加并调用
uniq
比交集运算符效率低得多。但是+1用于分析OPs代码不起作用的原因。请注意,将两个数组相加并调用
uniq
要低得多效率比交叉口操作员低。但是+1用于解释OPs代码不起作用的原因。