让我说我有
array1=[1,2,1,1,5]
我如何搜索任何重复项并将它们放入另一个数组中,例如array2,但是只有当有超过3种类型时?
我的目标是
array2=[1,1,1]
答案 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)