在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
所以我的问题是:
有没有更好的方法来做这个不涉及循环整个哈希?
请注意,我无法使用键值,因为在同一个哈希中会有多个具有相同类型的对象(并且键值用于表示其他内容)。
如果有一种简单的方法可以使用数组,那也可以(因为我可以很容易地将哈希转换为数组)。
谢谢!
编辑:修复了我的代码中的错误。
答案 0 :(得分:5)
hsh.values.select {|v| v.type == :x}.map(&:value).reduce(:+) / hsh.size
我正在尝试设计一个有效的函数,可以获得散列中某种类型的所有对象的平均值
除非我误解了您要说的内容,否则不您发布的代码是什么。 :x
机器人的平均值为21
(有3 :x
个机器人,其值为5
,25
和35
; {{1 }和5 + 25 + 35 == 65
除以3个机器人是65
),但是你的代码(以及我的代码,因为我在你的模型之后建模)打印21
。
是否有更好的方法来只获取类型的对象:x?
是。要选择元素,请使用13
方法。
有没有更好的方法来做这个不涉及循环整个哈希?
没有。如果要查找具有给定属性的所有对象,则必须查看所有对象以查看它们是否具有该属性。
您是否有实际的硬统计证据表明此方法会导致您的性能瓶颈?
答案 1 :(得分:0)
您也可以直接映射这样的键
hsh.values.map {|k| k[:x]}.reduce(:+) / hsh.size