首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Ruby的数组中对象的频率

使用Ruby的数组中对象的频率
EN

Stack Overflow用户
提问于 2010-03-17 21:38:20
回答 6查看 6.7K关注 0票数 4

如果我有一个球的列表,每个球都有一个颜色属性。我怎样才能干净地得到颜色最多的球的列表。

代码语言:javascript
运行
复制
[m1,m2,m3,m4]

说,

代码语言:javascript
运行
复制
        m1.color = blue
        m2.color = blue
        m3.color = red
        m4.color = blue

[m1,m2,m4]是颜色最频繁的球的列表

我的方法是:

代码语言:javascript
运行
复制
[m1,m2,m3,m4].group_by{|ball| ball.color}.each do |samecolor|
  my_items = samecolor.count
end

其中count定义为

代码语言:javascript
运行
复制
class Array
  def count
  k =Hash.new(0)
  self.each{|x|k[x]+=1}
  k
  end
end

my_items将是每个相同颜色组的频率散列。我的实现可能会有be,我觉得一定有更好、更聪明的方法。有什么想法吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-03-17 21:56:36

你的代码还不错,但效率很低。如果我是你,我会寻找一个只迭代数组一次的解决方案,如下所示:

代码语言:javascript
运行
复制
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)。

票数 2
EN

Stack Overflow用户

发布于 2010-03-17 22:37:14

你找到了group_by但错过了max_by

代码语言:javascript
运行
复制
max_color, max_balls = [m1,m2,m3,m4].group_by {|b| b.color}.max_by {|color, balls| balls.length}
票数 5
EN

Stack Overflow用户

发布于 2010-03-17 21:57:58

这样如何:

color,balls = [m1,m2,m3,m4].group_by { |b| b.color }.max_by(&:size)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2462609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档