2012-01-06 11 views
1

私は、時間の経過とともにオブジェクトを収集するプログラムを持っています。これらのオブジェクトは、しばしば、プログラムが既に受け取ったオブジェクトの重複ではありません。ユニークなオブジェクトの数は、時には数万に上がることがあります。私のリストが成長するにつれて、物体が出現したかどうかを特定するのに時間がかかります。Java:使用済みのオブジェクトを効率的に追跡する

私の現在の方法は、すべてをArrayListに格納することです。 Collections.sort(al)を使用します。 Collections.binarySearch(al、key)を使用して、オブジェクトを使用したかどうかを判断します。新しいオブジェクトを見つけるたびに、私は挿入して並べ替える必要があります。

これを行うより良い方法があるのだろうかと思います。含有物があまりにも早く減速する傾向があります。私は可能な限りO(1)に近いものを探しています。

ありがとうございました。

これはjavaです。私が話しているものを理解する目的のために、私は基本的にこれを行う方法が必要になります。

public boolean objectAlreadyUsed(Object o) { 
    return \\ Have we seen this object already? 

} 
+0

ArrayListの代わりにHashSetまたはHashMapを使用できます。 – afrischke

答えて

6

ArrayListを使用する代わりに、Setの実装(おそらくHashSet)を使用しないのはなぜですか? constant-time lookupが得られます。ソートは必要ありません。

N.B.オブジェクトにはcorrectly override hashCode() and equals()が必要です。

+0

私はhashListを見上げた。 :(\\数値はHashSetでした)ありがとう...試してみてください –

+0

これは数分で受け入れることができます完璧に作業しました幸いにも今回のオブジェクトは文字列なので余分な実装は必要ありません... **クリックを待つ... –

6

これは質問頼む - なぜ重複(例えばSet)許可しないデータ構造を使用しませんの?重複した項目をaddにしようとすると、メソッドはfalseを返し、データ構造は変更されません。

3

オブジェクトに正しいequals()hashCode()メソッドがあり、HashSetに保存されていることを確認してください。ルックアップは一定の時間になります。

インターネットで利用可能な多くのWeakHashSet実装のうちの1つを使用することを検討することができます。オブジェクトを保持しますが、必要に応じてオブジェクトをガベージコレクションできるようにします。

+0

私はこの時間にすべてのオブジェクトを保持する必要があります、私は吐き出すデータにとって重要ですが、知っておいてください。あなたはとても学び、あなたはJavaについて知っていることをすべて知っていると思います。 ..そしてあなたはしないでください:) –

関連する問題