如何在ruby中将重复项从一个数组复制到另一个数组?

时间:2017-09-07 16:09:43

标签: arrays ruby iteration

让我说我有

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

我如何搜索任何重复项并将它们放入另一个数组中,例如array2,但是只有当有超过3种类型时?

我的目标是

array2=[1,1,1]

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

我会做这样的事情:

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

答案 2 :(得分:1)

这保留了顺序并且具有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没有密钥k,则h[k]会返回默认值0

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

h[k] = h[k] + 1

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

h[k] = 0 + 1

前面的snytactic糖,前面的表达是

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

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