2016-04-24 32 views
3

内部のオブジェクトを検索する私は、特定のオブジェクトの回数を検索する必要がありますその内側にカスタムオブジェクトの大規模なリスト(約12,000オブジェクト)を持っています。現時点では、私は主にオブジェクトを見つけるために強引な力を使っていますが、リストが大きくなるにつれて非常に遅くなります。これは今のところどのように検索しているのですか。のJava:大規模なリスト

List<MyObject> objectsToSearch; //List containing about 12000 objects 
MyObject objectToCompare = new MyObject("this is a parameter"); //Object to compare with list 

for(MyObject compareFrom : objectsToSearch){ 

    if(compareFrom.equals(objectToCompare)){ 

     System.out.println("Object found"); 
    } 
} 

確かにこれを達成するにはより良い方法が必要です。この操作を複数回実行する必要があるため、パフォーマンスの向上は特に重要になります。

は、私の研究にもかかわらず、私は、任意の詳細なチュートリアルを発見していません。これをどのように達成するのですか?

+1

オプションをソートしてバイナリ検索しています。または最初の場所でHashSetを使用しますか? – schwobaseggl

+0

私はクイックまたはバイナリ検索を検討します。ブルートフォースは間違いなくあなたにとって最良の選択肢ではありません。 –

+1

a)データを 'Map'でインデックスします。またはb)複数のスレッドを使用する。またはc)何らかの形でデータをソートし、バイナリ検索を実行します。またはd)読まれたデータベースを使用して、それらを検索するために12,000のアイテムをメモリに格納することは、おそらく最も賢明な考えではありません。 –

答えて

2

(オブジェクトクラスMyObjectComparatorを実装して、Collections.sort()を使用してリストをソートして、あなたは正確にあなたが含まれている使用することができますが実装している場合Collections.binarySearch()

0

を適用するカスタムクラスのequalsメソッドをすることができますしてくださいo)メソッド。

if(objectsToSearch.contains(objectToCompare)){ 
    System.out.println("Object found"); 
2

本当にリストが必要ですか?オブジェクトが存在であるかどうかを確認しているようです。オブジェクトの順序を保持する必要がなく、各オブジェクトを一度しか保持できない場合は、代わりにSetを使用することをお勧めします。おそらくHashSetです。

は、あなたがそうでなければHashSetのが動作しません保存するオブジェクトのためのequals()とhashCode()を実装することを忘れないでください。

+0

実際にはオブジェクトからのデータが必要ですが、上記の例は広く簡素化されています。私はセットがオプションかもしれないことを見てきましたが、良いチュートリアルは見つかりませんでした。提案するものは何ですか? – justbourv

+0

コレクションでOracle Javaチュートリアルを試しましたか? –

関連する問題