2014-05-10 51 views
0

我一直在嘗試構建一個功能,使我能夠過濾Java集合中的數據。最終目標是有以下幾點。如何在Java集合上做Groupby,Sum,Avg,Min,Max?

SomeBuilder(Collections) 
.groupby("Key") 
.filter("Key","Value") 
.sum() 
.getResult() ; 

該功能大部分類似於sql的世界,但不完全。我的問題是如何過濾像List<HashMap<String,Object>這樣的集合?

如何將groupby邏輯應用於此類集合?

顯示過濾這種集合的代碼片段將有很大幫助。如果番石榴能做到這一點,請舉個例子。

編輯: - 我已經添加了這個問題的答案,但請建議更好的方法來做到這一點。希望這可以幫助他人。對於Sum,Avg,Count會隨着我的項目進行更新。

+0

'groupBy == filter'?爲什麼你有這樣的數據結構'List '?爲什麼不是'Map '或'MultiMap'。 Map是「kind-of」groupby的實現(group by the key),不是嗎? – Kent

+2

看看Java 8 Stream API及其收集器。來自番石榴的FluentIterable也可以做一些這些事情。 –

+0

由於遺留原因,我堅持使用數據結構和Java版本1.6。如果不使用行映射器,Jdbc會以這種格式向我們提供數據。還有其他方法,但許多工程師已經使用這種數據結構,然後對其進行了大量操作。我想插入一個後者可以調整性能的通用機制。我可以將List 更改爲番石榴的multimap。我嘗試運氣不多(新番荔枝)? –

回答

0

好的這是回答我自己的問題,哪些可以幫助他人。我將使用構建器模式來獲得方法鏈接的效果。過濾

List<HashMap<String,Object>> 

,我用番石榴,這裏是我試圖做的一個例子。不是最好的方式,而是首發。

private static Collection<HashMap<String, Object>> filter(
     List<HashMap<String, Object>> resMap, final String key, 
     final Object value) { 
    Predicate<Map<String, Object>> keyValueMatch = new Predicate<Map<String, Object>>() { 
     public boolean apply(Map<String, Object> stringStringMap) { 
      return value.equals(stringStringMap.get(key)); 
     } 
    }; 

    Collection<HashMap<String, Object>> transformedList = Collections2.filter(resMap, keyValueMatch); 
    return transformedList; 
} 

用法如下。

Collection<HashMap<String, Object>> transformedList = filter(input,"Dep","GlobalWarming"); 

希望得到這個幫助。歡迎任何更好的建議。

相關問題