zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【AtCoder】ARC067 F
    【AtCoder】ARC095 E
    【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
    【CodeForces】961 F. k-substrings 字符串哈希+二分
    【CodeForces】961 G. Partitions 斯特林数
    【BZOJ】2310: ParkII 插头DP
    【BZOJ】2331: [SCOI2011]地板 插头DP
    webpack从0开始---(二)
    webpack从0开始---(一)
    前端基础知识(不应需要思考的知识点)三
  • 原文地址:https://www.cnblogs.com/qiaoyihang/p/6166155.html
Copyright © 2011-2022 走看看