4

毎日適度な量のデータを処理する Java バックエンド コンポーネントを構築しています。Widget約 10 個のプロパティを持つ POJO があります。私のソフトウェアは、リストのグループを処理する必要がありWidgetます。基本的には、独自の をまとめて、List<Widget>それらを私のソフトウェアに送信する他のプロセス (完全に異なるシステム) があります。私のソフトウェアは実際に次のようなラッパー POJO を受け取ります。

public class Payload {
    private List<Widget> widgets; // <-- what I want
    private String guid; // GUID; my software doesn't need this
    private boolean fizz; // again, my software doesn't need this
    ... many other properties that I don't care about
}

List<Widget>私のソフトウェアは、それぞれが異なるシステムによって作成されたこれらすべてを集約し、1 つの大きなバッチでまとめて処理します。

この一連のリストArrayList<ArrayList<Widget>>を保持するためのデータ構造として暫定的に選択しました。(外側の)のWidgetグループは約 500,000 あり、それぞれに約 5の s があります。内側の合計で〜250万秒です。List<Widget>ArrayListList<Widget>WidgetWidgetArrayList

最近のコード レビューで、何人かの技術リーダーから、私がこのウィジェットのバッチに間違ったデータ構造を選択したと言われました。HashMap<String,List<Widget>>彼らは、より効率的で作業しやすいので、を使用するべきだったと私に言いました。Payloadハッシュマップ キーは、私のソフトウェアに与えられた に含まれる GUIDです。なんらかの理由で GUID が必要なわけではありません。これは、〜 500,000List<Widget>を個別に保持するためのキーとして機能するだけです。これを行う必要があります。

これは私に考えさせました:誰が正しいの?!? このデータ構造に対して行っている唯一の操作は、「追加」( の場合、またはビアをArrayList追加するだけ) と「読み取り」(私のソフトウェア内では、すべてを反復処理して検査する必要があります) です。私のネストされた要点は次のとおりです。WidgetList<Widget>add(...)WidgetArrayList

for(List<Widget> widgetList : myDoublyNestedArrayOfWidgets) {
    for(Widget widget : widgetList) {
        ...
    }
}

必要な操作はこれらだけです。異なるList<Widget>s をいくつかの大きな「バッチ」データ構造に追加し、後でそれらすべてを調べて、それぞれの を操作しますWidget。このソフトウェアは、多くのメモリと処理能力を備えた一部の強化されたサーバーで実行されます。

だから私は尋ねます:**ArrayList<ArrayList<Widget>>正しい選択、、、HashMap<String,List<Widget>>または何か他のものですか...そしてなぜですか?

4

6 に答える 6

2

使用し続けている名詞がありますが、データ モデルにはありません: Batch。それらをバッチに保持し、コードを読みやすくすることに本当に関心がある場合は、それらを Batch クラスにカプセル化します。

クラスバッチ{
    文字列ガイド。
    List<Widget> ウィジェット;
}

そして、バッチを気にしないのであれば、それらをすべて 1 つの にフラット化できますList<Widget>か?

于 2013-02-14T13:14:35.303 に答える
0

あなたの質問から、あなたがこれらのことをしていることは明らかです。

  1. データから読み取ります。
  2. さらにウィジェットを追加します。

データ構造の変更が上記の 2 つのアクティビティにどのように影響するかという疑問が生じますArrayList<ArrayList<Widget>> to HashMap<String,List<Widget>>

1)読み取り:それらを4つのグループにグループ化したため、hashmapハッシュを使用してグループを保存しますが、これは小さなデータセット(あなたの場合はグループ)には意味がないため、ここでハッシュマップを使用する必要はありません.

2) ウィジェットの追加: 追加しようとしているリストにアクセスします。使って損はない ArrayListObj.get(index)です。

Now UsingArrayListは常にwidgets順番に読み取ります。これは を使用して行われませんHashmapが、とにかくそれはあなたの懸念ではないと思いますか? :-)

于 2013-02-14T13:14:44.250 に答える
0

おそらく、組み込み (コア内) データベースが最終的に必要になるでしょう。もう 1 つの可能性は、JavaSpaces/NoSQL のような、配信と処理の分離です。依存します。

于 2013-02-14T13:13:09.250 に答える
0

内部リストにランダムにアクセスする必要がある場合、ハッシュマップはより効率的であり、ハッシュマップを使用するコードは、ネストされたループを見つけたときに蕁麻疹に襲われるレビュアーにとってよりエレガントに見えますただし、すべてのノードを反復してアクセスする必要がある場合は、On^2 よりもうまくいくことはありません。それらを DB に詰め込むこともできますが、それによって得られるのは複雑さ以外にはありません。ハッシュマップのように、よりエレガントです。もちろん、これはすべて、250 万個のウィジェットすべてを一度に保持するためのメモリがあることを前提としています。ページングする必要がある場合は、ある種の DB SQL または NoSQL の方がよいでしょう。

于 2013-02-14T13:18:26.407 に答える