Arrays 如何在ruby中手动递增?

Arrays 如何在ruby中手动递增?,arrays,ruby,loops,methods,increment,Arrays,Ruby,Loops,Methods,Increment,给定一个对象数组,有什么更“手动”的递增方式来查找出现次数大于2次的对象?我想出了两种“更短”的方法来解决这个问题,但我想知道是否有一种更抽象的方法,一种用某种计数器“手动”递增的方法。。。结果应该返回一个发生两次以上的贡献者数组 i、 e.[#,#] 贡献者= => #[, #, #, #, #, #, #] #方法1: 作者 contributors.select do | contributor | 贡献者。计数(贡献者)>2 完 结束 #方法2: def新撰稿人 存储=[] 贡献者。每个

给定一个对象数组,有什么更“手动”的递增方式来查找出现次数大于2次的对象?我想出了两种“更短”的方法来解决这个问题,但我想知道是否有一种更抽象的方法,一种用某种计数器“手动”递增的方法。。。结果应该返回一个发生两次以上的贡献者数组

i、 e.
[#,#]

贡献者=
=> #[,
#,
#,
#,
#,
#,
#]
#方法1:
作者
contributors.select do | contributor |
贡献者。计数(贡献者)>2
完
结束
#方法2:
def新撰稿人
存储=[]
贡献者。每个人都做贡献者|
如果参与者。计数(参与者)>2
在循环中使用
Array#count
存储是次优的(复杂性
O(N^2)

要增加变量,请使用
v+=1
。这是做这件事的自然方式:

counts = contributors.each_with_object(Hash.new(0)) { |contributor, counts|
  counts[contributor] += 1
}
more_than_twice = counts.select { |contributor, count| count > 2 }.keys


1不要与v2.6中首次出现的方法混淆

.keys
select
return
Hash
?@Fabio:当应用于
Hash
时,我小时候流行的
counts
计算变体是
counts=contributors。每个带有_对象({}contributor,counts | counts[contributor]=(counts[contributor]| 0)+1}的
counts = contributors.each_with_object(Hash.new(0)) { |contributor, counts|
  counts[contributor] += 1
}
more_than_twice = counts.select { |contributor, count| count > 2 }.keys
class Author
  attr_reader :name
  def initialize(name)
    @name = name
  end
end
contributors = [["Dassey Davidson", 1], ["Alice Allison", 3],
                ["Bob Bryce", 3]].
  flat_map { |name, reps| [Author.new(name)] * reps }
  #=> [#<Author:0x00005bd271073ce0 @name="Dassey Davidson">,
  #    #<Author:0x00005bd271073c68 @name="Alice Allison">,
  #    #<Author:0x00005bd271073c68 @name="Alice Allison">,
  #    #<Author:0x00005bd271073c68 @name="Alice Allison">,
  #    #<Author:0x00005bd271073bc8 @name="Bob Bryce">,
  #    #<Author:0x00005bd271073bc8 @name="Bob Bryce">,
  #    #<Author:0x00005bd271073bc8 @name="Bob Bryce">] 
contributors.group_by(&:itself).
             select { |_, arr| arr.size > 2 }.
             keys
  #=> [#<Author:0x00005bd271073c68 @name="Alice Allison">,
  #    #<Author:0x00005bd271073bc8 @name="Bob Bryce">] 
g = contributors.group_by(&:itself)
  #=> {#<Author:0x00005bd271073ce0 @name="Dassey Davidson">=>
  #      [#<Author:0x00005bd271073ce0 @name="Dassey Davidson">],
  #    #<Author:0x00005bd271073c68 @name="Alice Allison">=>
  #      [#<Author:0x00005bd271073c68 @name="Alice Allison">,
  #       #<Author:0x00005bd271073c68 @name="Alice Allison">,
  #       #<Author:0x00005bd271073c68 @name="Alice Allison">],
  #    #<Author:0x00005bd271073bc8 @name="Bob Bryce">=>
  #      [#<Author:0x00005bd271073bc8 @name="Bob Bryce">,
  #       #<Author:0x00005bd271073bc8 @name="Bob Bryce">,
  #       #<Author:0x00005bd271073bc8 @name="Bob Bryce">]} 
h = g.select { |_, arr| arr.size > 2 }
  #=> {#<Author:0x00005bd271073c68 @name="Alice Allison">=>
  #      [#<Author:0x00005bd271073c68 @name="Alice Allison">,
  #       #<Author:0x00005bd271073c68 @name="Alice Allison">,
  #       #<Author:0x00005bd271073c68 @name="Alice Allison">],
  #    #<Author:0x00005bd271073bc8 @name="Bob Bryce">=>
  #      [#<Author:0x00005bd271073bc8 @name="Bob Bryce">,
  #       #<Author:0x00005bd271073bc8 @name="Bob Bryce">,
  #       #<Author:0x00005bd271073bc8 @name="Bob Bryce">]} 
h.keys
  #=> <as above>
(contributors.difference((contributors.uniq * 2).flatten)).uniq