从数组中检索满足某些特征的对象

时间:2016-07-30 19:59:50

标签: ruby search

我在数组objects中有一些对象。给定一个属性 - 值对,我需要一个函数来返回匹配它的第一个对象。例如,给定objects.byName "John",它应该返回带有name: "John"的第一个对象。

目前我正在这样做:

def self.byName name
  ID_obj_by_name = {}
  @@objects.each_with_index do |o, index|
    ID_obj_by_name[o.name] = index
  end
  @@objects[ID_obj_by_name[name]]
end

但它似乎很慢,并且使用了大量内存。我怎样才能改善这个?

2 个答案:

答案 0 :(得分:1)

如果您需要表现,您应该考虑这种方法:

require 'benchmark'

class Foo
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

# Using array ######################################################################
test = []
500000.times do |i|
  test << Foo.new("ABC" + i.to_s + "#!@#@!DS")
end

puts "using array"
time = Benchmark.measure {
  result = test.find { |o| o.name == "ABC250000#!@#@!DS" }
}
puts time
####################################################################################
# Using a hash #####################################################################

test = {}
i_am_your_object = Object.new
500000.times do |i|
  test["ABC" + i.to_s + "#!@#@!DS"] = i_am_your_object
end

puts "using hash"
time = Benchmark.measure {
  result = test["ABC250000#!@#@!DS"]
}
puts time
####################################################################################

结果:

using array
  0.060000   0.000000   0.060000 (  0.060884)
using hash
  0.000000   0.000000   0.000000 (  0.000005)

答案 1 :(得分:0)

尝试类似

的内容
def self.by_name name
  @@objects.find { |o| o.name == name }
end