выбор хеш-значений по значению свойства в ruby - PullRequest
1 голос
/ 19 сентября 2010

В 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 ]

5 голосов
/ 19 сентября 2010
hsh.values.select {|v| v.type == :x}.map(&:value).reduce(:+) / hsh.size

Я пытаюсь разработать эффективную функцию, которая может получить среднее значение всех объектов определенного типа в пределах хеша

Если я не понял, что вы пытаетесь сказать, это , а не , что делает код, который вы опубликовали. Среднее значение :x роботов равно 21 (есть 3 :x роботов, со значениями 5, 25 и 35; 5 + 25 + 35 == 65 и 65, разделенными на 3 робота, 21 ), но ваш код (и мой, поскольку я смоделировал мой по вашему) печатает 13.

Есть ли лучший способ получить только объекты типа: x?

Да. Чтобы выбрать элементы, используйте метод select.

есть ли лучший способ сделать это, не включающий циклический просмотр всего хеша?

Нет. Если вы хотите найти все объекты с данным свойством, вам нужно посмотреть на все объекты, чтобы узнать, имеют ли они это свойство.

Есть ли у вас фактические достоверные статистические доказательства того, что этот метод вызывает ваши узкие места в производительности?

0 голосов
/ 06 июля 2015

Вы также можете напрямую сопоставить ключи, как это

hsh.values.map {|k| k[:x]}.reduce(:+) / hsh.size
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...