如果我有一个球的列表,每个球都有一个颜色属性。我怎样才能干净地得到颜色最多的球的列表。
[m1,m2,m3,m4]说,
m1.color = blue
m2.color = blue
m3.color = red
m4.color = blue[m1,m2,m4]是颜色最频繁的球的列表
我的方法是:
[m1,m2,m3,m4].group_by{|ball| ball.color}.each do |samecolor|
my_items = samecolor.count
end其中count定义为
class Array
def count
k =Hash.new(0)
self.each{|x|k[x]+=1}
k
end
endmy_items将是每个相同颜色组的频率散列。我的实现可能会有be,我觉得一定有更好、更聪明的方法。有什么想法吗?
发布于 2010-03-17 21:56:36
你的代码还不错,但效率很低。如果我是你,我会寻找一个只迭代数组一次的解决方案,如下所示:
balls = [m1, m2, m3, m4]
most_idx = nil
groups = balls.inject({}) do |hsh, ball|
hsh[ball.color] = [] if hsh[ball.color].nil?
hsh[ball.color] << ball
most_idx = ball.color if hsh[most_idx].nil? || hsh[ball.color].size > hsh[most_idx].size
hsh
end
groups[most_idx] # => [m1,m2,m4]这基本上与group_by做相同的事情,但同时它计数组并保持记录哪个组是最大的(most_idx)。
发布于 2010-03-17 22:37:14
你找到了group_by但错过了max_by
max_color, max_balls = [m1,m2,m3,m4].group_by {|b| b.color}.max_by {|color, balls| balls.length}发布于 2010-03-17 21:57:58
这样如何:
color,balls = [m1,m2,m3,m4].group_by { |b| b.color }.max_by(&:size)
https://stackoverflow.com/questions/2462609
复制相似问题