2012-04-16 18 views
0

私はJava(学習している)データ構造に熟練しておらず、どのようなタイプのリストを選択するのかよく分かりませんでした。私の問題は、データを受け取り、リストに対してチェックするソケットサービスを作成することです。存在しない場合は、処理対象のデータを渡し、同じデータがリストにないようにリストにデータID番号を追加します(データを処理しているサービスは重複した作業があるかどうか分かりませんので、これがフィルタとして機能しています)。選択するリストの種類は不明ですか?

arraylistは高速ですが、以前はリストのサイズを知っておく必要があることがわかりましたが、これは成長し続けるほどではありません(確かに数十億アイテムになるでしょう)。私は古いファッション整数[]を使うと思っていましたが、より良い方法があれば尋ねると思っていました。

私のプロセスに関連する詳細はいくつかありますが、データそのものは複雑ですが、参照用にデータをハッシュコードに変換してチェックするので、すべてのデータが整数(正/負)クライアントの要求は実行可能ファイルを介して行われるので、データをより効率的にするために何かできることがあれば、それを行うことができます(すべての整数がループを速くするために頻繁にソートするので、 integer []は十分に良いの?

+1

2,147,483,647を超えるアイテムは当てられません。そうすれば、選択するリストの種類よりも大きな問題が発生します。 – Jeffrey

+0

@ジェフリー私は指が交差しないようにします:-) – Lostsoul

+0

重複を避けるためにリストの代わりにセットを使うべきでしょう。 – Hassan

答えて

1

IDが数字または文字列の場合は、IDのタイプがIDTypeint)のHashSet<IDType>を使用できます。これにより、最適な検索時間が確保され、すべての要素が1回だけ保存されます。

ArrayListも動作しますが、それを検索するには、(すべての要素を比較して)最悪の場合のシナリオで、リスト全体を走査しなければなりません。

2
it will surely hit several billion items 

私はそれを非常に疑っています。これは、ギガバイトのデータになります。

実際に何十億ものアイテムがある場合は、メモリではなくデータベースに保存することをおすすめします。いくつかのクエリを高速化するために、メモリ内のサブセットをキャッシュできることは確かですが、長期的な解決策は、サーバがダウンしても値を保持するデータベースです。

IDが存在するかどうかを確認して確認するデータベースクエリでは、ミリ秒のコストがかかります。私はそれをメモリに保存するよりも長期的な解決策だと思います。

+0

+1持続 – Korinna

1

貴重なアイテムをチェックしようとしている場合は、いずれの方法でもすべてのアイテムを保管する必要があります。私はHaspMapの使用をお勧めします。また、十分でない場合は、複数のhashmapsを使用することもできます。

あなたは簡単にあなたが項目が何かに基づいて区別することができると思う場合は、1つhashmap以上のものを使用し

if(map.containsKey(blah)) 
    //Do something 

を行うことによって確認することができます。それはより速いかもしれません。 また、アイテムがこのように大きいので、LinkedHashMapと一緒にHashMapを使用してキャッシュを行うことをお勧めします。 LinkedHashMapは頻繁に発生するアイテムを優先度Qで保存するため、プロセスが高速化されます。

1

すでにデータをハッシュしている場合は、ハッシュコレクションのいずれかを使用してください。リストではなくHashSetまたはHashMap?

関連する問題