欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java集合分组

程序员文章站 2022-03-02 16:57:43
...
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