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面试指南>仓库,更多精彩内容请到我的仓库里查 ...
随机推荐
- C#操作word或excel及水晶报表,检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005
解决办法一:<转自http://www.cnblogs.com/Sue_/articles/2123372.html> 具体解决方法如下: 1:在服务器上安装office的Excel软件. ...
- 启用数据库的 Service Broker
--is_broker_enabled为0未启用,为1启用SELECT name,is_broker_enabled FROM sys.databases WHERE name = 'DBNAME' ...
- 【转】EL表达式 (详解)
EL表达式 1.EL简介 1)语法结构 ${expression} 2)[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一 ...
- 利用Yii框架中的collections体验PHP类型化编程
注:20150514 看过 惠新宸 关于PHP7的PPT后,看到了这一特性将被支持. Scalar Type Declarations function foo(int num) function ...
- 2016暑假多校联合---A Simple Chess
2016暑假多校联合---A Simple Chess Problem Description There is a n×m board, a chess want to go to the po ...
- 第十一届“蓝狐网络杯”湖南省大学生计算机程序设计竞赛 B - 大还是小? 字符串水题
B - 大还是小? Time Limit:5000MS Memory Limit:65535KB 64bit IO Format: Description 输入两个实数,判断第一个数大 ...
- Myeclipse10下载,安装,破解,插件,优化介绍
一.Myeclipse10下载与破解 Genuitec 公司发布了MyEclipse 10,一款Genuitec旗下的商业化Eclipse集成开发工具的升级版本.MyEclipse 10基于Eclip ...
- IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream
一.文件的遍历 1.需求:对指定目录进行所有的内容的列出(包含子目录的内容)-文件的深度遍历 思想:递归的思想,在递归的时候要记住递归的层次. public class FileTest { publ ...
- JSON.stringify()和JOSN.parse()
JSON.stringify()跟JSON.parse() 终于把这两个方法搞清楚了!!! JSON.tringify():把一个json数据转化成JSON string JSON.stringify ...
- reset
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, ...