【问题标题】:Ruby: How to find to similarity in two arraysRuby:如何在两个数组中找到相似度
【发布时间】:2019-05-08 00:55:25
【问题描述】:

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

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

我正在使用 +

组合两个数组

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

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

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

【问题讨论】:

  • [1,1,2][1,3,1]的共同元素是什么?一个1 还是两个?如果1 只是arr1 &amp; arr2

标签: arrays ruby uniq


【解决方案1】:

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

a = exchange_one.get_symbols
b = exchange_two.get_symbols

intersection = a & b

【讨论】:

    【解决方案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}
    

    这就是为什么您要获取“pairs”数组中的所有值。

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

     pairs = (arr1+arr2).uniq
    
    OR
    
     pairs = arr1 & arr2 #best and efficient way.
    
    

    【讨论】:

    • 请注意,将两个数组相加并调用uniq 的效率远低于交集运算符。但是 +1 说明了为什么 OP 代码不起作用。
    【解决方案3】:

    假设:

    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 1s 和 arr2 包含 2 1s。如果您希望通过“公共元素”报告两个数组都包含[5, 2].min #=&gt; 21s,以及出现在任一数组中的其他元素的类似计数,您可以执行以下操作:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多