2010-11-22 10 views
0

私はRubyを試していますが、私は必要なプログラムを作っています。私はカスタムクラスを持っており、そのクラスのオブジェクトの配列が必要です。このカスタムクラスには、プログラムの過程で変化するいくつかの属性があります。 アレイ内の特定のオブジェクトを見つけると、そのオブジェクトにアクセスして変更することはできますか?Ruby配列オブジェクトfind

class Mathima 
    attr_accessor :id, :tmimata 

    def initialize(id) 
    @id = id 
    @tmimata = [] 
    end 
end 


# main 
mathimata = [] 

previd = id = "" 
File.read("./leit/sortedinput0.txt").lines do |line| 
    array = line.split(' ')   # i am reading a sorted file 
    id = array.delete_at(0)   # i get the first two words as the id and tmima 
    tmima = array.delete_at(0) 

    if previd != id 
    mathimata.push(Mathima.new(id)) # if it's a new id, add it 
    end 

    # here is the part I have to go in mathimata array and add something in the tmimata array in an object. 

    previd = id 
end 
+0

を行う方法どのMathimaオブジェクトに何かを追加するかを指定します。その「何か」は何ですか、それはtmimaの内容ですか? –

+0

ありがとうございます。私はmathimataのためのハッシュを使用して、それはうまく動作しています。 – pvinis

答えて

2

グレッグが指摘したようにmathimataのハッシュを使用します。

mathimata = {} 
File.read("./leit/sortedinput0.txt").lines do |line| 
    id, tmima, rest = line.split(' ', 3) 
    mathimata[id] ||= Mathima.new(id) 
end 
+1

'ids'が長くなるにつれ、ルックアップのために遅くなり、遅くなります。ハッシュが速くなります。 –

+0

ありがとう!ハッシュはコードをシンプルにします –

2
mathima = mathimata.find{|mathima| mathima.check() } 
# update your object - mathima 
0

Array.find()あなたは、配列を順番に検索できますが、それはうまくスケールしません。

多くのオブジェクトや要素を扱っていて、それらが一意である場合、ハッシュがはるかに優れていることをお勧めします。ハッシュは、キーに基づいて索引付き検索を可能にします。

mathimata.push(Mathima.new(id)) # if it's a new id, add it 

セット配列とハッシュの間にある:ので、あなたの

は唯一の良い選択となる固有のIDを設定またはハッシュのどちらかを維持しています。それはコレクション内のユニークなエントリだけを許可するので、それは排他的なArrayのようです。ハッシュのようなキーによるルックアップ/アクセスは許可されません。

また、あなたはより多くのRubyのような方法であなたの最初の二つの単語を取得することができます:

array = line.split(' ')   # i am reading a sorted file 
id = array.delete_at(0)   # i get the first two words as the id and tmima 
tmima = array.delete_at(0) 

正常に書き込まれることになります。

id, tmima = line.split(' ')[0, 2] 

か:

id, tmima = line.split(' ')[0 .. 1]