如果我有一个球的列表,其中每个都有一个颜色属性。我怎么能干净地得到最频繁颜色的球的列表。使用红宝石的阵列中的对象的频率
[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
end
my_items将是同一颜色组的频率散列值。我的实施可能是越野车,我觉得必须有一个更好,更聪明的方式。 有什么想法吗?
如果您从数据库中获取数据尝试优化sql以加快计算速度 – Nishu 2010-03-17 14:03:04
除非您的数据集非常小,否则我强烈建议使用下面的线性时间解决方案。如果您在相同的数据上迭代多次(例如,group_by后面跟着每个或每个类别),那么您的工作量应该高达两倍。 – 2010-03-17 15:16:44