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面试指南>仓库,更多精彩内容请到我的仓库里查 ...
随机推荐
- 新浪微博.Net SDK第三版源代码和示例【最后一次更新了】
时间过得飞快,距离上次SDK更新已经3年有余.随着官方的不断跟新,老版SDK的部分接口已经不能正常使用.因此在QQ群里来吐槽的.来谩骂的朋友也开始多了起来.随着时代的发展,微博已经彻底的被微信甩开,因 ...
- 使用attrs.xml自定义属性
控件有很多属性,如android:id.android:layout_width.android:layout_height等,但是这些属性都是系统自带的属性.使用attrs.xml文件,可以自己定义 ...
- 清除Windows的DNS缓存
最近ESET杀毒软件老是提示受到DNS缓存攻击,然后就不能打开网页,或者打开得很慢.这是由于缓存的DNS被更改,访问的是错误的IP地址造成的. 解决的办法就是清除DNS缓存,打开DOS命令窗口,先后输 ...
- MySQL Cursor
MySQL Cursor Summary: in this tutorial, you will learn how to use MySQL cursor in stored procedures ...
- Firemonkey 控件设定字型属性及颜色
将控件 StyledSettings 的勾取消(如此才能自定样式及字型,如果勾选则依 Style 而定). 设定 TextSettings 里的 Font 属性. 使用代码寫法: CheckBox1. ...
- IT男常用软件网站整理
1. 猎豹免费WiFI. 属于wifi共享软件. 360免费wifi.. 2. 悟空VPN, 免费VPN.http://www.wkdaili.net/ 3. PLSQL. 4. WinSCP, ...
- linux下c程序的链接、装载和库(1)
读完<程序员的自我修养--链接.装载和库>相关章节,想来总结一下,若有错误,请指正,多谢. 1. 什么叫目标文件? 你的工程里有很多xxx.c这样的源文件,这些文件是文本文件,只有人能够认 ...
- 更新整理本人所有博文中提供的代码与工具(Java,2013.08)
为了更方便地管理博文中涉及的各种代码与工具资源,现在把这些资源迁移到 Google Code 中,有兴趣者可前往下载. Java 1.<高效 Java Web 应用开发框架 JessMA v3. ...
- MongoDB环境准备
1.安装MongoDB MongoDB的安装非常简单,只需要将下载的MongoDB的压缩文件解压到任意目录,并将其中的bin目录加入到系统的path环境变量中即可 2.启动MongoDB 在启动Mon ...
- 【转】超实用PHP函数总结整理
原文链接:http://www.codeceo.com/article/php-function.html 1.PHP加密解密 PHP加密和解密函数可以用来加密一些有用的字符串存放在数据库里,并且通过 ...