Java集合分组
public class Data {
private Long id ;
private Long courseId ;
private String content ;
public Long getId() {
return id;
}
public Data setId(Long id) {
this.id = id;
return this ;
}
public Long getCourseId() {
return courseId;
}
public Data setCourseId(Long courseId) {
this.courseId = courseId;
return this ;
}
public String getContent() {
return content;
}
public Data setContent(String content) {
this.content = content;
return this ;
}
}
public class GroupTest {
/**
* 分組依據接口,用于集合分組時,獲取分組依據
* @author ZhangLiKun
* @title GroupBy
* @date 2013-4-23
*/
public interface GroupBy<T> {
T groupby(Object obj) ;
}
/**
*
* @param colls
* @param gb
* @return
*/
public static final <T extends Comparable<T> ,D> Map<T ,List<D>> group(Collection<D> colls ,GroupBy<T> gb){
if(colls == null || colls.isEmpty()) {
System.out.println("分組集合不能為空!");
return null ;
}
if(gb == null) {
System.out.println("分組依據接口不能為Null!");
return null ;
}
Iterator<D> iter = colls.iterator() ;
Map<T ,List<D>> map = new HashMap<T, List<D>>() ;
while(iter.hasNext()) {
D d = iter.next() ;
T t = gb.groupby(d) ;
if(map.containsKey(t)) {
map.get(t).add(d) ;
} else {
List<D> list = new ArrayList<D>() ;
list.add(d) ;
map.put(t, list) ;
}
}
return map ;
}
@Test
public void test() {
// 准备一个集合
final int loop = 1000 * 1000 ;
List<Data> list = new ArrayList<Data> () ; // size=8 * loop
for(int i = 0 ; i < loop ;i ++) {
list.add(new Data().setId(1L).setCourseId(200010L).setContent("AAA")) ;
list.add(new Data().setId(2L).setCourseId(200010L).setContent("BBB")) ;
list.add(new Data().setId(3L).setCourseId(200011L).setContent("CCC")) ;
list.add(new Data().setId(4L).setCourseId(200011L).setContent("DDD")) ;
list.add(new Data().setId(5L).setCourseId(200010L).setContent("EEE")) ;
list.add(new Data().setId(6L).setCourseId(200011L).setContent("FFF")) ;
list.add(new Data().setId(7L).setCourseId(200010L).setContent("GGG")) ;
list.add(new Data().setId(8L).setCourseId(200012L).setContent("HHH")) ;
}
// 进行分组
Map<Long ,List<Data>> map = group(list, new GroupBy<Long>() {
@Override
public Long groupby(Object obj) {
Data d = (Data)obj ;
return d.getCourseId() ; // 分组依据为课程ID
}
}) ;
Assert.assertEquals(3, map.size()) ;
Assert.assertEquals(4*loop, map.get(200010L).size()) ;
Assert.assertEquals(3*loop, map.get(200011L).size()) ;
Assert.assertEquals(1*loop, map.get(200012L).size()) ;
Assert.assertEquals("HHH", map.get(200012L).get(0).getContent()) ;
// 长度为8 * 1000 * 1000的集合测试用时:6481毫秒!
}
private long time ;
@Before
public void setup() {
time = System.currentTimeMillis() ;
}
@After
public void teardown() {
System.out.println(String.format("程序执行:%d毫秒!",System.currentTimeMillis() - time));
}
}
转自:https://my.oschina.net/zhanglikun/blog/124645
Java集合分组的更多相关文章
- java~集合分组groupby的实现
对于数据聚合来说,分组操作是很常见的,在.net里有lambda和linq,而在java里也有lambda,现在我们来实现对一个集合进行分组. 一 准备工作,有两个类型 @Value class It ...
- java通过Stream对list集合分组
java通过Stream对list集合分组 现在有一个List集合,想对该集合中的数据分组处理,想到java8中的stream,就搞来试试,非常给力!例子如下 1 2 3 4 5 6 7 8 9 10 ...
- JAVA 集合 List 分组的两种方法
CSDN日报20170219--<程序员的沟通之痛> [技术直播]揭开人工智能神秘的面纱 程序员1月书讯 云端应用征文大赛,秀绝招,赢无人机! JAVA 集合 List 分组的两种方法 2 ...
- JAVA 集合 按照某个字段(依据一定条件)进行分组
由于数据不能够在本地化实现, 无法通过sql语句得到对应的结果,小编只好在业务层处理.通过调用接口得到集合,拿到集合后,通过年来分组,以此来达到对应的Map集合... 在这里小编给大家提供一个封装了一 ...
- java集合-hashCode
hashCode 的作用 在 Java 集合中有两类,一类是 List,一类是 Set 他们之间的区别就在于 List 集合中的元素师有序的,且可以重复,而 Set 集合中元素是无序不可重复的.对于 ...
- Java 集合系列 14 hashCode
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- List集合分组实现教程
封装一个方法,用一个Map来实现,这里是根据bean类的seq字段进行拆分的,分成好几个list private LinkedHashMap<String,List<HandleInfo& ...
- Java 集合系列之五:Map基本操作
1. Java Map 1. Java Map 重要观点 Java Map接口是Java Collections Framework的成员.但是它不是Collection 将键映射到值的对象.一个映射 ...
- Java集合详解3:一文读懂Iterator,fail-fast机制与比较器
<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...
随机推荐
- javascript常用判断写法
js验证表单大全,用JS控制表单提交 ,javascript提交表单 目录:1:js 字符串长度限制.判断字符长度 .js限制输入.限制不能输入.textarea 长度限制 2.:js判断汉字.判断是 ...
- 提高生产性工具 - Model代码生成器(二)
首先,我想阐述一下我开发这个工具的一个观点. 如果大家做过对日软件的话,很多时候,日方是进行设计的,数据模型是什么样子的,各个字段的类型,需要做什么验证,验证规则,错误信息,都是日方制定的. 外包就是 ...
- ASP.NET MVC 模块与组件(二)——定制图片验证码
本着简洁直接,我们就直奔主题吧! 下面是一个生成数字和字母随机组合的验证码类源代码: using System; using System.Drawing; using System.Drawing ...
- MySQL中select * for update锁表的范围
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流
[源码下载] 不可或缺 Windows Native (13) - C++: 标准输入, 标准输出, 字符串内存流 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 标准输 ...
- Eclipse下FatJar插件的安装与使用
在Eclipse下生成jar包分很多种情况.最简单的情况是没有用到第三方jar包,那么直接Export就可以生成jar包.但是如果用到了第三方jar包,那么就比较繁琐了,很不方便.FatJar可以解决 ...
- 2015暑假多校联合---Zero Escape(变化的01背包)
题目链接 http://acm.hust.edu.cn/vjudge/contest/130883#problem/C Problem Description Zero Escape, is a vi ...
- JavaWeb前端基础复习笔记系列 一
课程:孔浩前端视频教程(CMS内容管理系统case) 1.背景知识 ASPCMS,是一个基于asp的CMS.类似于Jeecms是基于Java的.aspcms:http://www.aspcms.com ...
- [mysql] 查看mysql执行时间
mysql的 profiling不是默认打开的 查看profiling是否找开 mysql> show variables like "%pro%"; +---------- ...
- Java空白final
Java 1.1允许我们创建"空白final",它们属于一些特殊的字段.尽管被申明为final,但却未得到一个初始值. 无论在哪种情况下,空白final都必须在实际使用前得到正确的 ...