给定两个大小相等的数组,如何找到匹配元素的数量而不考虑位置?
例如:
[0,0,5]
和[0,5,5]
将返回2
的匹配项,因为共有一个0
和一个5
; [1,0,0,3]
和[0,0,1,4]
会返回3
的匹配,因为有两个匹配的0
和一个匹配的1
; [1,2,2,3]
和[1,2,3,4]
将返回3
。我尝试了很多想法,但它们都倾向于变得粗糙和复杂。我猜测有一些很好的Ruby习惯用法,或者也许是一个正则表达式,可以很好地回答这个解决方案。
答案 0 :(得分:4)
您可以使用count
完成此操作:
a.count{|e| index = b.index(e) and b.delete_at index }
或inject
:
a.inject(0){|count, e| count + ((index = b.index(e) and b.delete_at index) ? 1 : 0)}
a.select{|e| (index = b.index(e) and b.delete_at index)}.size
结果:
a, b = [0,0,5], [0,5,5]
输出: => 2
; a, b = [1,2,2,3], [1,2,3,4]
输出: => 3
; a, b = [1,0,0,3], [0,0,1,4]
输出 => 3
。答案 1 :(得分:3)
(arr1 & arr2).map { |i| [arr1.count(i), arr2.count(i)].min }.inject(0, &:+)
此处(arr1 & arr2)
返回两个数组包含的uniq值的列表,arr.count(i)
计算数组中项i
的数量。
答案 2 :(得分:2)
我在答案here中定义的强大(非常需要)Array#difference
的另一种用法。此方法类似于Array#-
。以下示例说明了这两种方法之间的区别:
a = [1,2,3,4,3,2,4,2]
b = [2,3,4,4,4]
a - b #=> [1]
a.difference b #=> [1, 3, 2, 2]
对于本申请:
def number_matches(a,b)
left_in_b = b
a.reduce(0) do |t,e|
if left_in_b.include?(e)
left_in_b = left_in_b.difference [e]
t+1
else
t
end
end
end
number_matches [0,0,5], [0,5,5] #=> 2
number_matches [1,0,0,3], [0,0,1,4] #=> 3
number_matches [1,0,0,3], [0,0,1,4] #=> 3
答案 3 :(得分:1)
使用multiset gem:
(Multiset.new(a) & Multiset.new(b)).size
Multiset与Set类似,但允许重复值。 &
是“set intersection”运算符(返回两个集合中的所有内容)。
答案 4 :(得分:0)
我不认为这是一个理想的答案,因为它有点复杂,但是......
<main id="swipe-page">
<div class="dragend-page">
<div class="page-content"></div>
<div class="page-content"></div>
<div class="page-content"></div>
</div>
<div class="dragend-page">
<div class="page-content"></div>
<div class="page-content"></div>
</div>
<div class="dragend-page">
<div class="page-content"></div>
<div class="page-content"></div>
<div class="page-content"></div>
<div class="page-content"></div>
<div class="page-content"></div>
</div>
</main>
基本上,首先编写一个方法,从每个元素出现次数的数组创建一个哈希。然后,使用它们来总结每个元素在两个数组中出现的最小次数。