2012-04-05 9 views
2

私は、Javaの機能に似た高速の「グループ」を実装したいと考えています。 私はList<List<String>>を持っています。異なるインデックスでグルーピングすることに基づいて繰り返したいと思います。例えばJavaマップ/リストを使用した同様の構造のグループ

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

Iは、第1および第3の列にgroupping使用して、いくつかの集計をしたいです。 そして私はそれが速いことを望みます - すべてのクエリですべての合計を計算しないでください。 "テーブル"の値は常に変化しています。 考えていますか?

答えて

0

Javaはそのタスクにはあまり適していません。私はむしろメモリ内のSQLデータベースを使いたいと思います。最初に値を表にダンプしてから、select SQL文のグループ化、順序付けまたは合計を別の列で行を取得します。

1

SQLデータベースを使用するのが最も簡単な(プログラミングの少ない)アプローチのように聞こえます。 in-memory SQLiteデータベースを使用できます。 SQLite用に最適なJavaライブラリはXerial.orgです。

1

いくつかの検討事項:まず、アイテムを並べ替える注文ごとにカスタムComparatorが必要です。そして、あなたがそうで

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

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

としていますのは、あなたのオブジェクトがFooインスタンスであると仮定しましょう。

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

ここで問題となるのは、多くのカスタムソートオーダーが必要で、それを動的に更新することです。私がここで提案するのは、同じアイテムを含む多くの異なるコレクションを既に注文していることです。

あなたは、たとえば、持っていることによってそれを行うことができます:あなたがセットに項目を追加するとき

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

を今、あなただけの両方のコレクションに追加する必要があり、彼らは自動的にすでに注文されます、あなたは」勝ちましたソートを呼び出す必要があり、要素を追加または削除すると動的に更新されます。唯一の追加的な重みは、オブジェクトへの参照を2倍にすることで、速度のためにスペースを交換しているということです。

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

関連する問題