`
yo8237233
  • 浏览: 60976 次
  • 来自: 深圳
社区版块
存档分类
最新评论

Java集合分组

    博客分类:
  • J2EE
阅读更多
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 集合分组排序帮助类有好的意见可以互相交流不甚感激

    java集合分组(Guava)

    因工作的需要,利用Guave对集合进行分组。这是个最简单的例子,希望对大家有用。

    java8 集合 多字段 分组 统计个数代码

    主要介绍了java8 集合 多字段 分组 统计个数代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    java list集合分组工具

    对list分组操作,进行封装。 相对于java8stream流分组操作相对,更好一些。

    java1.8 中 stream 的 groupingBy 最大值、最小值分组

    主要是介绍在 JDK8中使用 stream 流的 groupingBy 方法源进行最大值分组、最小值分组、平均值分组、统计分组

    JAVA JDK8 List分组的实现和用法

    今天小编就为大家分享一篇关于JAVA JDK8 List分组的实现和用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    java集合类原理面试题

    java集合类 Java中有哪些容器(集合类)? 线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组...

    Java集合框架测试

    现在假定有三个分组:“我的好友”,“我的同学”, “我的亲人”,每个分组包括若干好友(一个数组)。 现做如下定义: Map, List&lt;Friend&gt;&gt; data = new HashMap, List&lt;Friend&gt;&gt;(); List&lt;Friend&gt; friends =...

    关于Java中List对象的分页思想-按10个或者n个数对list进行分组

    关于Java中List对象的分页思想-按10个或者n个数对list进行分组

    java8 stream自定义分组求和并排序的实现

    主要介绍了java8 stream自定义分组求和并排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    MongoDB聚合分组取第一条记录的案例与实现方法

    今天开发同学向我们提了一个紧急的需求,从集合mt_resources_access_log中,根据字段refererDomain分组,取分组中最近一笔插入的数据,然后将这些符合条件的数据导入到集合mt_resources_access_log_new中。...

    java使用elasticsearch分组进行聚合查询过程解析

    主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JAVA JDK8 List分组获取第一个元素的方法

    今天小编就为大家分享一篇关于JAVA JDK8 List分组获取第一个元素的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    java版list-map实现 树结构 父子结构 通俗易懂

    此java类实现了对数据表的分类递归树的实现,为本人倾力之作,后期,会发布js版,敬请期待!

    Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合.md

    Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda,给我们操作集合(Collection)提供了极大的便利。 Stream将要处理的元素集合看作一种流,在流的过程中,借助`Stream API`对流中的...

    java通讯录系统 (手机)

    java通讯录系统 上下查询 添加 删除等功能

    Java8处理集合的优雅姿势之Stream

    主要给大家介绍了关于Java8优雅处理集合之Stream的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    集合购物车

    这是一个用集合做的购物车,方便于新手学习练手...............................................................................................................................................................

    java开源包4

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

Global site tag (gtag.js) - Google Analytics