将数组中重复元素的数量限制为给定值

时间:2016-03-31 15:57:45

标签: arrays ruby duplicates

在Ruby中,如果我有array个重复项且给定值n

array = [1,56,1,245,56,1,56,1,56,1,56]

n = 2

如何限制arrayn内的重复次数,同时还保留剩余元素的位置以产生此效果?

array = [1,56,1,245,56]

3 个答案:

答案 0 :(得分:4)

def ndup(list, n)
  cnts = {}
  list.select do |item|
    cnts[item] ||= 0
    cnts[item] += 1
    cnts[item] <= n
  end
end

ndup([1,56,1,245,56,1,56,1,56,1,56], 2)
#=> [1, 56, 1, 245, 56]

答案 1 :(得分:1)

def ff(array, n)
  occurances = Hash.new(0)
  array.uniq do |element|
    occurances[element] = occurances[element] < n ? occurances[element].next : n
    [element, occurances[element]]
  end
end

答案 2 :(得分:1)

使用计数哈希是这里的方法,但这里有另一种选择:

array.each_with_index.
      group_by(&:first).
      values.
      flat_map { |a| a.first(n) }.
      sort_by(&:last).
      map(&:first)
  #=> [1, 56, 1, 245, 56] 

步骤如下。

enum = array.each_with_index
  #=> #<Enumerator: [1, 56, 1, 245, 56, 1, 56, 1, 56, 1, 56]:each_with_index> 
h = enum.group_by(&:first)
  #=> {  1=>[[1, 0], [1, 2], [1, 5], [1, 7], [1, 9]],
  #     56=>[[56, 1], [56, 4], [56, 6], [56, 8], [56, 10]],
  #    245=>[[245, 3]]} 
a = h.values
  #=> [[[1, 0], [1, 2], [1, 5], [1, 7], [1, 9]],
  #    [[56, 1], [56, 4], [56, 6], [56, 8], [56, 10]],
  #    [[245, 3]]] 
b = a.flat_map { |a| a.first(n) }
  #=> [[1, 0], [1, 2], [56, 1], [56, 4], [245, 3]] 
c = b.sort_by(&:last)
  #=> [[1, 0], [56, 1], [1, 2], [245, 3], [56, 4]] 
c.map(&:first)
  #=> [1, 56, 1, 245, 56]