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

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集合框架中的`List`接口和数组(Array)是两种常用的数据结构,它们在处理数据时各有优势。下面我们将深入探讨如何在Java中实现集合的分组与排序。 1. **集合分组**: 集合分组通常涉及到`GroupingBy`操作,这...

    java集合分组(Guava)

    Java集合框架是编程中不可或缺的一部分,它提供了丰富的数据结构和操作接口,如List、Set、Map等。然而,有时候我们可能需要对集合数据进行更复杂的处理,比如分组,这时Guava库就显得非常有用。Guava是Google推出的...

    java实现分组聚合

    这个主题通常与Java集合框架和流API紧密相关,特别是`GroupingBy`方法,它为数据分组提供了方便的接口。以下是对"java实现分组聚合"这一主题的详细解释。 首先,让我们了解Java中的分组概念。在Java中,我们经常...

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

    在Java 8中,集合操作得到了极大的增强,特别是在处理数据分组和统计方面。这里我们将深入探讨如何使用Java 8的Stream API对集合进行多字段分组和统计个数。 首先,我们有一个`User`实体类,包含了`id`, `userName`...

    (Java)人群随机分组 by 夜猫

    在Java编程中,实现"人群随机分组"的需求通常涉及到数组、集合以及随机数生成等基础知识。本项目 `(Java)人群随机分组 by 夜猫` 提供了一个解决方案,旨在将一组人(可以理解为一个数据列表)尽可能均匀地划分为四个...

    java 按照每周分组

    这个需求通常涉及到日期处理和集合分组。以下将详细讲解如何在Java中实现这一功能。 首先,我们需要理解日期的处理。在Java中,日期和时间的处理主要依赖于`java.util.Date`、`java.util.Calendar`以及自Java 8引入...

    java list集合分组工具

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

    JAVA JDK8 List分组的实现和用法

    JAVA JDK8 List分组的实现和用法 JAVA JDK8 List分组的实现和用法是指在JAVA中,使用JDK 8的Stream API对List进行分组的操作。分组是指根据某个属性将List中的元素分配到不同的组中,以便于后续处理。 在JDK 8中,...

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

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

    Java集合框架测试

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

    java按照每周分组 改进版

    2. 如何使用Java集合框架(如List, Map)来存储和处理分组后的数据。 3. 数据库查询优化,如SQL的GROUP BY语句与DATE_TRUNC函数结合,按周对数据进行聚合。 4. 如何读取和处理Excel数据,可能使用Apache POI库或者...

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

    然后,我们可以使用 Java8 Stream 的 `collect` 方法对集合进行分组求和,并使用 `TreeMap` 来排序。 在示例代码中,我们首先创建了一个 `List` 集合,用于存储多个 `GroupDetailDTO` 对象。然后,我们使用 Java8 ...

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

    Java中List对象的分页思想-按10个或者n个数对list进行分组 Java中List对象的分页思想是一种常用的数据处理技术,通过将一个大的List对象分割成多个小的List对象,每个小的List对象包含一定数量的元素,例如10个或n...

    Java开发关于正态分布的等距分组

    在实际编程实现过程中,可能需要使用Java的基础类库如Math类来计算均值和标准差,还需要利用数组或集合来存储数据和分组信息。此外,Java的标准库中并没有直接提供与直方图绘制相关的类库,因此,绘制直方图时可能...

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

    Java 使用 Elasticsearch 进行分组聚合查询过程解析 Java 使用 Elasticsearch 进行分组聚合查询是一个常见的需求,特别是在大数据处理和数据分析领域。Elasticsearch 提供了强大的聚合功能,可以对数据进行分组、...

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

    首先,需要了解Java 8中的Stream API,它允许开发者通过流式处理来处理集合操作。 Stream API提供了一个高效的方式来处理大规模的数据集。 在这个例子中,我们使用了Collectors.collectingAndThen方法来对组内的...

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

    在这个特定的案例中,开发人员面临一个紧急需求,需要从名为 `mt_resources_access_log` 的集合中根据 `refererDomain` 字段进行分组,并从每个分组中选取最新插入的数据。这个任务在MongoDB中可以通过聚合框架(`...

    hbase 的java代码 集合 hbase 0.96

    4. **列族和列**:在HBase中,数据被组织在列族(Column Family)内,列族是逻辑上的分组,每个列族可以包含任意数量的列(Column Qualifier)。在Java代码中,我们通过`ColumnFamilyDescriptor`定义列族,并在`...

    JAVA简单分组的算法实现

    例如,`Collectors.groupingBy`是Java 8引入的流API的一部分,可以方便地对集合进行复杂分组操作。这通常比手动实现分组算法更为简洁且高效。 总结来说,这个简单的Java分组算法实现了将数组按固定数量分组的功能,...

    java中的集合笔记.rar

    以上只是Java集合框架的基础知识,实际应用中还需要考虑内存管理、集合容量、遍历效率等因素,以及根据具体需求选择合适的集合类型和操作方式。通过深入学习和实践,可以更好地掌握这个强大的工具集,提升Java编程的...

Global site tag (gtag.js) - Google Analytics