2

Javaに高速の「groupby」のような機能を実装したいと思います。があり、List<List<String>>さまざまなインデックスでのグループ化に基づいて繰り返し処理したいと思います。

例えば:

A1 B1 C1 value_1 A1 B1 C2 value_2 A1 B2 C1 value_3  A1 B2 C2 value_4

1列目と3列目のグループ化を使用した集計が必要です。そして、私はそれを高速にしたいのです-すべてのクエリですべての合計を計算することは避けてください。「テーブル」の値は絶えず変化しています。何かご意見は?

4

3 に答える 3

1

最も簡単な (最小限のプログラミング) アプローチは、SQL データベースを使用することです。インメモリ SQLiteデータベースを使用できます。SQLite に最適な Java ライブラリは、Xerial.orgから入手できます。

于 2012-04-05T13:01:19.640 に答える
1

いくつかの考慮事項: まず Comparator、アイテムを並べ替えたいすべての注文にカスタムが必要です。Fooオブジェクトがインスタンスであると仮定しましょう。

class FirstComparator implements Comparator<Foo> {
  public int compareTo(Foo o1, Foo o2) {
    ...
  }
}

class SecondComparator implements Comparator<Foo> {
  public int compareTo(Foo o1, Foo o2) {
    ...
  }
}

等々。

その後、 を使用してコレクションを簡単に並べ替えることができますCollections.sort(fooList, yourComparator)

ここでの問題は、多くのカスタム ソート順が必要であり、それらを動的に更新する必要があることです。ここで私が提案する最善の方法は、同じアイテムを含むさまざまなコレクションを、すでに順番に並べておくことです。

たとえば、次のようにすることで実行できます。

TreeMap<Foo> firstOrder = new TreeMap<Foo>(new FirstComparator<Foo>());
TreeMap<Foo> secondOrder = new TreeMap<Foo>(new SecondComparator<Foo>());

アイテムをセットに追加するときは、両方のコレクションに追加するだけで自動的に並べ替えられます。並べ替えを呼び出す必要はなく、要素を追加または削除すると動的に更新されます。唯一の追加の重みは、オブジェクトへの参照が 2 倍になることです。そのため、速度のためにスペースを交換しています。

ツリーに追加された後に列の値が変更された場合、これは機能しないことに注意してください。これは、TreeMap明示的に呼び出す必要がある全体の再ソートが必要になるためです。マップ内の既存の要素のコンパレータ値を変更すると、それが無効になります。

于 2012-04-05T13:01:30.750 に答える
0

Java はそのタスクにはあまり適していません。インメモリ SQL データベースを使用したいと思います。select最初に値をテーブルにダンプしてから、異なる列でグループ化、順序付け、または合計する SQL ステートメントを使用して行を取得します。

于 2012-04-05T13:00:51.837 に答える