Ruby 查找具有重复项的两个数组的相同内容
我想找到两个数组之间相同的所有元素,包括在两个数组中重复多次的元素。例如,我想要Ruby 查找具有重复项的两个数组的相同内容,ruby,Ruby,我想找到两个数组之间相同的所有元素,包括在两个数组中重复多次的元素。例如,我想要 [1,1,1,2] 及 给予 [1,1] 我可以遍历数组并跟踪它,但我想知道是否有一种更为ruby的方法可以做到这一点。这看起来像是您想要的。Ruby核心库或stdlib中没有多集数据结构,但是您可以在web上找到多个实现。我只想(这并不重要,multiset是一个数学概念,有严格的定义,所有实现的行为或多或少都是一样的): 需要“多集” ms=Multiset[1,1,1,2]&Multiset[1,1,3,
[1,1,1,2]
及
给予
[1,1]
我可以遍历数组并跟踪它,但我想知道是否有一种更为ruby的方法可以做到这一点。这看起来像是您想要的。Ruby核心库或stdlib中没有多集数据结构,但是您可以在web上找到多个实现。我只想(这并不重要,multiset是一个数学概念,有严格的定义,所有实现的行为或多或少都是一样的):
需要“多集”
ms=Multiset[1,1,1,2]&Multiset[1,1,3,4]
#=> #
杜女士
#=> [1, 1]
如果必须,可以使用将其转换为数组,但请记住:可以调用的大多数有趣方法实际上都来自mixin,因此可用于所有集合;实际上,您通常不需要阵列。它看起来像是您想要的。Ruby核心库或stdlib中没有多集数据结构,但是您可以在web上找到多个实现。我只想(这并不重要,multiset是一个数学概念,有严格的定义,所有实现的行为或多或少都是一样的):
a = [1,1,1,2,5]
b = [1,1,3,2,4,2]
def counting_hash(arr)
arr.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
end
hb = counting_hash(b)
#=> {1=>2, 3=>1, 2=>2, 4=>1}
counting_hash(a).each_with_object([]) do |(k,v),a|
n = [v, hb[k]].min
n.times { a << k } if n > 0
end
#=> [1, 1, 2]
需要“多集”
ms=Multiset[1,1,1,2]&Multiset[1,1,3,4]
#=> #
杜女士
#=> [1, 1]
如果必须,可以使用将其转换为数组,但请记住:可以调用的大多数有趣方法实际上都来自mixin,因此可用于所有集合;实际上,您通常不需要数组
a = [1,1,1,2,5]
b = [1,1,3,2,4,2]
def counting_hash(arr)
arr.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
end
hb = counting_hash(b)
#=> {1=>2, 3=>1, 2=>2, 4=>1}
counting_hash(a).each_with_object([]) do |(k,v),a|
n = [v, hb[k]].min
n.times { a << k } if n > 0
end
#=> [1, 1, 2]
及
ashb
的默认值为零
及
由于
hb
的默认值为零。您希望[1,2]
和[1,1,3]
返回什么[1]
或[1,1]
?@spickermann[1]
@Blubber:您是在寻找两个数组中最长的共享序列还是它们共享的所有重复元素?@Linuxios他们共享的所有元素,即使它们没有重复或无序?使用[1,1,6,11]
和[42,1,23,11,1]
会发生什么?您希望[1,1,11]
、[1,11,1]
或[11,1,1]
对吗?您希望[1,2]
和[1,1,3]
返回什么[1]
或[1,1]
?@spickermann[1]
@Blubber:您是在寻找两个数组中最长的共享序列还是它们共享的所有重复元素?@Linuxios他们共享的所有元素,即使它们没有重复或无序?使用[1,1,6,11]
和[42,1,23,11,1]
会发生什么?你会期望[1,1,11]
,[1,11,1]
,或者[11,1,1]
对吗?
a = [1,1,1,2,5]
b = [1,1,3,2,4,2]
def counting_hash(arr)
arr.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
end
hb = counting_hash(b)
#=> {1=>2, 3=>1, 2=>2, 4=>1}
counting_hash(a).each_with_object([]) do |(k,v),a|
n = [v, hb[k]].min
n.times { a << k } if n > 0
end
#=> [1, 1, 2]
counting_hash(a)
#=> {1=>3, 2=>1, 5=>1}
hb[5]
#=> 0