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面试指南>仓库,更多精彩内容请到我的仓库里查 ...
随机推荐
- script加载文件
- 【Java每日一题】20161108
package Nov2016; import java.util.TreeSet; public class Ques1108 { public static void main(String[] ...
- When to close cursors using MySQLdb
http://stackoverflow.com/questions/5669878/when-to-close-cursors-using-mysqldb I'm building a WSGI w ...
- JMS中的消息通信模型
1. MQ简介: 消息队列(Message Queue,简称MQ),是应用程序与应用程序之间的一种通信方法.应用程序通过发送和检索出入列队的针对应用程序的数据 - 消息来通信,而无需专用连接来链接它们 ...
- Android总结篇系列:Android Service
Service通常总是称之为“后台服务”,其中“后台”一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面,因此,从实际业务需求上来理解,Service的适用场景应该具备以下条件: ...
- windows 7/10下安装oracle 10g
有段时间没搞oracle了,最近要给别人在win 7下装个oracle 10g,特记录备忘下. 使用http://download.oracle.com/otn/nt/oracle10g/10201/ ...
- The POM for XXX:jar:${com.ld.base.service.version} is missing, no dependency information available
最近有个jar改了名字后,有个依赖它的工程死活引用的是老名字,导致打包的时候出错,如下所示: [INFO] ---------------------------------------------- ...
- Intro.js 网站演示
Intro.js 为您的网站和项目提供一步一步的.更好的介绍 使用简单 引入 js 和 css,然后在代码中加入步骤和介绍. 快速小巧 7 KB 的 JavaScript 和 3 KB CSS,就是全 ...
- OpenGL显示图片
最近想用C++在windows下实现一个基本的图像查看器功能,目前只想到了使用GDI或OpenGL两种方式.由于实在不想用GDI的API了,就用OpenGL的方式实现了一下基本的显示功能. 用GDAL ...
- Emacs学习心得之 基础配置
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础配置 1.前言2.基础配置 一.前言 本篇博文记录了Emacs的一 ...