2014-05-10 48 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"); 

希望得到这个帮助。欢迎任何更好的建议。

相关问题