【问题标题】:How can i copy duplicates from one array to another in ruby?如何在 ruby​​ 中将重复项从一个数组复制到另一个数组?
【发布时间】:2018-02-16 11:05:00
【问题描述】:

假设我有

array1=[1,2,1,1,5]

我如何搜索任何重复项并将它们放入另一个数组中,例如 array2,但前提是有 3 个以上的同类?

我的目标是

array2=[1,1,1]

【问题讨论】:

  • 我建议先阅读EnumerableArray 上的文档。他们在这里拥有您需要的一切。
  • 你需要在这里更具体。订单需要保留吗?您还需要将它们从原始数组中删除吗?
  • 没有订单或删除,如果有超过 3 个重复项,则只对将重复项存储在另一个数组中感兴趣

标签: arrays ruby iteration


【解决方案1】:

使用 select,您可以获得 array1 中出现 3 次或更多次的元素,正如我在您的预期输出中看到的那样:

array1 = [1,2,1,1,5]
array2 = array1.select { |e| array1.count(e) >= 3 }
p array2
# [1, 1, 1]

如果没有元素重复 3 次或更多次,则 array2 将为空。

【讨论】:

    【解决方案2】:

    我会这样做:

    array1.group_by(&:itself).select { |_, v| v.size >= 3 }.values.flatten
    #=> [1,1,1]
    

    【讨论】:

      【解决方案3】:

      这保留了顺序并具有 O(n) 时间复杂度,n 是数组的大小。

      array1 = [3,2,1,3,2,1,1,5,2,1,3,3]
      array1 - array1.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }.
                      select { |_,cnt| cnt <= 3 }.keys
        #=> [3, 1, 3, 1, 1, 1, 3, 3]
      

      步骤如下。

      g = array1.each_with_object(Hash.new(0)) { |n,h| h[n]+= 1 }
        #=> {3=>4, 2=>3, 1=>4, 5=>1}
      h = g.select { |_,cnt| cnt <= 3 }
        #=> {2=>3, 5=>1}
      a = h.keys
        #=> [2, 5]
      array1 - a
        #=> [3, 1, 3, 1, 1, 1, 3, 3]
      

      Hash::new 具有默认值(此处为零)通常称为计数哈希。如果h = Hash.new(0)h 没有键kh[k] 返回默认值0

      当 Ruby 遇到表达式 h[k] += 1 时,她要做的第一件事就是将其扩展为

      h[k] = h[k] + 1
      

      如果h 没有密钥k,则变为

      h[k] = 0 + 1
      

      放弃语法糖,前一个表达式为

       h.[]=(k, h.[](k) + 1)
      

      返回默认值的是方法Hash#[],而不是方法Hash#[]=

      【讨论】:

        猜你喜欢
        • 2012-09-28
        • 2011-05-08
        • 1970-01-01
        • 2020-06-01
        • 2022-07-05
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 2017-09-13
        相关资源
        最近更新 更多