2012-04-05 28 views
2

我想在Java中實現一個快速的「group by」特性。 我有一個List<List<String>>,我想通過基於不同索引的分組進行迭代。使用Java地圖/列表的類似結構的組

例如:

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

我想要一些聚集在使用第一和第三列groupping。 我希望它快速 - 避免在每個查詢中計算每個總和。 「表格」的值不斷變化。 有什麼想法?

回答

0

Java並不適合這項任務。我寧願去一個內存中的SQL數據庫。首先將這些值轉儲到表中,然後使用select SQL語句分組檢索行,按不同列進行排序或求和。

1

真的聽起來像最簡單(最少編程)的方法是使用SQL數據庫。你可以使用一個in-memory SQLite數據庫。最好的SQLite Java庫來自Xerial.org

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>()); 

現在,當你添加一個項目設定你應該把它添加到兩個集合,它們就已經被自動排序,你贏了」你不得不打電話給他們排序,並且當你添加或刪除元素時會動態更新。唯一的額外的重量是你將兩倍的對象的引用,所以你正在交易的速度空間。

請注意,如果列值在添加到樹後發生更改,這將不起作用,因爲這需要重新整理必須明確調用的整個TreeMap。如果您更改地圖中現有元素的比較值,則只會使其無效。

相關問題