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