使用するベストコレクション? [閉まっている]
-
08-07-2019 - |
質問
ログファイルを読み込んでいますが、すべての行をすぐに処理したいわけではありません。行が処理されるのを待つ間、キュー/バッファを使用して行を保存しています。
このキューは特定の行について定期的にスキャンされます-それらが見つかると、それらはキューから削除されます(それらはその中のどこにあってもかまいません)。特定の行が見つからない場合、行はキューの先頭から1つずつ取り出されて処理されます。
したがって、キューには以下が必要です。
- サイズを変更できる(またはその印象を与える)
- どこからでも要素を削除する
- 要素を追加しました(常にキューの最後になります)
- すばやくスキャンする
- パフォーマンスに応じて、最後のスキャンでどこに到達したかを示すポインタを用意します。
最初にコードを書いたのはJavaまたはAPIの経験がほとんどないときで、ArrayListを使用したのは、それが機能することがわかっていたからです(必ずしも最適なオプションではなかったからです)。
現在、処理する必要があるログが増えているため、パフォーマンスが低下しているので、この状況でどのコレクションを使用することをお勧めしますか?私自身も書く可能性は常にあります。
ありがとう
解決
LinkedHashSetは興味深いかもしれません。これは事実上HashSetですが、LinkedListを維持して予測可能な反復順序を可能にします。したがって、FIFOキューとしても使用でき、重複エントリを含めることができないという優れた追加の利点があります。
HashSetでもあるため、 equals()
他のヒント
LinkedListはおそらく最も適切です。要求されたすべてのプロパティがあり、ArrayListに必要な線形時間ではなく、一定の時間でリンクを中央から削除できます。
削除する次の要素を見つけるための特定の戦略がある場合は、PriorityQueueまたはソートされたセットがより適切な場合があります。
迅速にスキャンされることは、一般的に何らかのハッシュベースの実装を意味します。ConcurrentSkipListMapが適切な実装である可能性があります。 containskeyのLog(n)、removeおよびgetメソッド、およびソートされているため、何らかの優先順位を関連付けることができます。
読み取り中の行をソートしたくありません(元の順序に維持する必要があります)。ただし、ログに記録された各行が持つセッションIDに基づいて行をブロックする可能性があります(セッションごとにいくつかのログに記録された行)。
それについて考えると、私は潜在的に以下を持つことができます:
HashMap<String,LinkedList<String>>
そしてセッションIDをキーとして提供し、LinkedListにセッションに属する行を追加します。
マップはセッションXで実行する行をすばやく検索する方法を提供し、リンクリストは行を追加/削除するための最高のパフォーマンスを提供します(検索パフォーマンスはセッションxで実行する行を見つけることでした。したがって、セッションxで実行する実際の行を読み取り、最初から最後まで削除することができます(プッシュ/ポップ)。
サイズ変更され、行末に行が追加され、常に先頭から取得されるリンクリストよりも優れたコレクションがありますか?とにかく、キューコレクションはリンクリストを拡張すると思いますか?
セットから要素を削除および追加し、特定の値を検索する必要があるため、TreeSetなどのSortedSetを実装するものがより適切な構造になる可能性があります。このクラスは、追加、削除、および包含のlog(n)パフォーマンスを保証します。
いくつかのスレッドがキューに書き込みを行い、別のスレッドがキューから読み取ると推測します。
この場合、java.lang.concurrentパッケージのキューを確認する必要があります。
PriorityBlockingQueueを使用して要素を並べ替えたり、繰り返し処理して削除する要素を選択する場合はLinkedBlockingQueueを使用したりできます。
AVIに同意します。リンクリストが最適な選択肢です。簡単にサイズを変更したり、リストの最後にすばやく追加したり、どこからでもすばやく削除したりできます。検索は高速ではありませんが、他のソートされていないリストよりも悪くはありません。
グアバが役立つ場合があります。
Guavaプロジェクトには、Javaベースのプロジェクトで使用するGoogleのコアライブラリがいくつか含まれています。コレクション、キャッシュ、プリミティブサポート、同時実行ライブラリ、共通の注釈、文字列処理、I / Oなどです。