2016-07-30 3 views
0

配列内にいくつかのオブジェクトがあります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 

をしかし、それは非常に遅いようで、多くのメモリを使用しています。これをどのように改善できますか?

+0

別にあなたの質問(のための[可算#からの@Ursusで示されているように、[find](http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-find)が答えです)、いくつかのことが際立ちます:1) 'ID_ obj_by_name'は、大文字で始まるので、定数です。代入を使ってメソッド内で定数を作成することはできません: 'def a; A = 1; end#=> SyntaxError:動的定数の代入。それを 'id_obj_by_name'としましょう。 2)1つのRubyのコンベンションでは、変数名とメソッド名に「蛇の場合」*を使用することができます。「byName」ではなく「by_name」です。あなたはその大会に従う必要はありませんが、私たちの99%以上はそうします。 (cont。)... –

+0

... 3)あなたのメソッドは、クラス変数(@@ objects)は "トップレベル"からアクセスすることができないので、未指定のクラス内になければなりません。したがって、メソッドをクラス定義にラップする必要があります。 –

答えて

0

パフォーマンスが必要な場合は、この方法を検討してください

def self.by_name name 
    @@objects.find { |o| o.name == name } 
end 
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 + "#[email protected]#@!DS") 
end 

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

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

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

結果:

using array 
    0.060000 0.000000 0.060000 ( 0.060884) 
using hash 
    0.000000 0.000000 0.000000 ( 0.000005) 
関連する問題