在ruby中按value属性选择哈希值

时间:2010-09-18 23:12:10

标签: ruby arrays algorithm performance hash

在Ruby中,我有一个对象哈希。每个对象都有一个类型和一个值。我试图设计一个有效的函数,可以获得散列中某种类型的所有对象的平均值。

以下是目前实施方式的示例:

#the hash is composed of a number of objects of class Robot (example name)
class Robot
  attr_accessor :type, :value

  def initialize(type, value)
    @type = type
    @value = value
  end

end


#this is the hash that inclues the Robot objects
hsh = { 56 => Robot.new(:x, 5), 21 => Robot.new(:x, 25), 45 => Robot.new(:x, 35), 31 => Robot.new(:y, 15), 0 => Robot.new(:y, 5) }


#this is the part where I find the average
total = 0
count = 0
hsh.each_value { |r|  
if r.type == :x        #is there a better way to get only objects of type :x ?
  total += r.value 
  count += 1
end
} 

average = total / count

所以我的问题是:

有没有更好的方法来做这个不涉及循环整个哈希?

请注意,我无法使用键值,因为在同一个哈希中会有多个具有相同类型的对象(并且键值用于表示其他内容)。

如果有一种简单的方法可以使用数组,那也可以(因为我可以很容易地将哈希转换为数组)。

谢谢!

编辑:修复了我的代码中的错误。

2 个答案:

答案 0 :(得分:5)

hsh.values.select {|v| v.type == :x}.map(&:value).reduce(:+) / hsh.size
  

我正在尝试设计一个有效的函数,可以获得散列中某种类型的所有对象的平均值

除非我误解了您要说的内容,否则您发布的代码是什么。 :x机器人的平均值为21(有3 :x个机器人,其值为52535; {{1 }和5 + 25 + 35 == 65除以3个机器人是65),但是你的代码(以及我的代码,因为我在你的模型之后建模)打印21

  

是否有更好的方法来只获取类型的对象:x?

是。要选择元素,请使用13方法。

  

有没有更好的方法来做这个不涉及循环整个哈希?

没有。如果要查找具有给定属性的所有对象,则必须查看所有对象以查看它们是否具有该属性。

您是否有实际的硬统计证据表明方法会导致您的性能瓶颈?

答案 1 :(得分:0)

您也可以直接映射这样的键

hsh.values.map {|k| k[:x]}.reduce(:+) / hsh.size