计算数组中的匹配元素

时间:2015-06-14 16:43:34

标签: arrays ruby

给定两个大小相等的数组,如何找到匹配元素的数量而不考虑位置?
例如:

  1. [0,0,5][0,5,5]将返回2的匹配项,因为共有一个0和一个5;
  2. [1,0,0,3][0,0,1,4]会返回3的匹配,因为有两个匹配的0和一个匹配的1;
  3. [1,2,2,3][1,2,3,4]将返回3
  4. 的匹配项

    我尝试了很多想法,但它们都倾向于变得粗糙和复杂。我猜测有一些很好的Ruby习惯用法,或者也许是一个正则表达式,可以很好地回答这个解决方案。

5 个答案:

答案 0 :(得分:4)

您可以使用count完成此操作:

a.count{|e| index = b.index(e) and b.delete_at index }

Demonstration

inject

a.inject(0){|count, e| count + ((index = b.index(e) and b.delete_at index) ? 1 : 0)}

Demonstration

selectlength或别名 - size):

a.select{|e| (index = b.index(e) and b.delete_at index)}.size

Demonstration

结果:

  1. a, b = [0,0,5], [0,5,5] 输出: => 2;
  2. a, b = [1,2,2,3], [1,2,3,4] 输出: => 3;
  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>

基本上,首先编写一个方法,从每个元素出现次数的数组创建一个哈希。然后,使用它们来总结每个元素在两个数组中出现的最小次数。