1. 程式人生 > >JAVA 集合 List 分組的兩種方法

JAVA 集合 List 分組的兩種方法

從網上找了兩種方法,效率差不多,這裡貼出程式碼供大家參考

實體類Data

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 ;
    }
    
}

排序類
<pre name="code" class="java">import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.framework.util.ParamUtils;

public class CommonUtils {

	/**
	 * 分組依據介面,用於集合分組時,獲取分組依據
	 * 
	 * @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;
	}
	/**
	 * 將List<V>按照V的methodName方法返回值(返回值必須為K型別)分組,合入到Map<K, List<V>>中<br>
	 * 要保證入參的method必須為V的某一個有返回值的方法,並且該返回值必須為K型別
	 * 
	 * @param list
	 *            待分組的列表
	 * @param map
	 *            存放分組後的map
	 * @param clazz
	 *            泛型V的型別
	 * @param methodName
	 *            方法名
	 */
	public static <K, V> void listGroup2Map(List<V> list, Map<K, List<V>> map, Class<V> clazz, String methodName) {
		// 入參非法行校驗
		if (null == list || null == map || null == clazz || !ParamUtils.chkString(methodName)) {
			System.out.print("CommonUtils.listGroup2Map 入參錯誤,list:" + list + " ;map:" + map + " ;clazz:" + clazz + " ;methodName:" + methodName);
			return;
		}

		// 獲取方法
		Method method = getMethodByName(clazz, methodName);
		// 非空判斷
		if (null == method) {
			return;
		}

		// 正式分組
		listGroup2Map(list, map, method);
	}
	/**
	 * 根據類和方法名,獲取方法物件
	 * 
	 * @param clazz
	 * @param methodName
	 * @return
	 */
	public static Method getMethodByName(Class<?> clazz, String methodName) {
		Method method = null;
		// 入參不能為空
		if (null == clazz || !ParamUtils.chkString(methodName)) {
			System.out.print("CommonUtils.getMethodByName 入參錯誤,clazz:" + clazz + " ;methodName:" + methodName);
			return method;
		}

		try {
			method = clazz.getDeclaredMethod(methodName);
		} catch (Exception e) {
			System.out.print("類獲取方法失敗!");
		}

		return method;
	}
	/**
	 * 將List<V>按照V的某個方法返回值(返回值必須為K型別)分組,合入到Map<K, List<V>>中<br>
	 * 要保證入參的method必須為V的某一個有返回值的方法,並且該返回值必須為K型別
	 * 
	 * @param list
	 *            待分組的列表
	 * @param map
	 *            存放分組後的map
	 * @param method
	 *            方法
	 */
	@SuppressWarnings("unchecked")
	public static <K, V> void listGroup2Map(List<V> list, Map<K, List<V>> map, Method method) {
		// 入參非法行校驗
		if (null == list || null == map || null == method) {
			System.out.print("CommonUtils.listGroup2Map 入參錯誤,list:" + list + " ;map:" + map + " ;method:" + method);
			return;
		}

		try {
			// 開始分組
			Object key;
			List<V> listTmp;
			for (V val : list) {
				key = method.invoke(val);
				listTmp = map.get(key);
				if (null == listTmp) {
					listTmp = new ArrayList<V>();
					map.put((K) key, listTmp);
				}
				listTmp.add(val);
			}
		} catch (Exception e) {
			System.out.print("分組失敗!");
		}
	}

}



測試類
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.framework.common.CommonUtils.GroupBy;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 準備一個集合

		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"));
		}
		// 進行分組 1
		long time = System.currentTimeMillis();
		Map<Long, List<Data>> map2 = new LinkedHashMap<Long, List<Data>>();
		CommonUtils.listGroup2Map(list, map2, Data.class, "getId");// 輸入方法名
		
		long duration = System.currentTimeMillis() - time;

		System.out.println("分組一執行:" + duration + "毫秒!");

		// 分組二
		time = System.currentTimeMillis();
		Map<Long, List<Data>> map = CommonUtils.group(list, new GroupBy<Long>() {
			@Override
			public Long groupby(Object obj) {
				Data d = (Data) obj;
				return d.getCourseId(); // 分組依據為課程ID
			}
		});

		duration = System.currentTimeMillis() - time;

		System.out.println("分組二執行:" + duration + "毫秒!");

	}

}

相關推薦

JAVA 集合 List 分組方法

從網上找了兩種方法,效率差不多,這裡貼出程式碼供大家參考 實體類Data public class Data { private Long id ; private Long courseId ; private String content ;

實現List集合排序的方法(使用Collections.sort方法

1:實現comparable package core.java.collection.collections;      public class User implements Comparable<User>{              private i

list集合排序的方法

不同 () true 中介 mic value this brush sys 1. 第一種方式使用 Collections 工具類中的 sort() 方法    順便介紹Collections工具類的sort()方法:    參數不同: 1 . void sort(

java快排(方法

span ast [] ati pub 方法 color 整體 blog 快排是最基礎的排序算法之一,今天來回顧一下。 public class QuickSort { public static void quickSort(int[] ar

java String轉Long方法區別

基本數據 ring oat 兩種 基本 ava ger parse 兩種方法 第一種:包裝類型:Byte,Integer,Short,Long,Boolean,Character,Float,Double等8種 Long.valueOf("String")返回Long包裝

Jackson 處理複雜型別(List,map)方法

方法一: String jsonString="[{'id':'1'},{'id':'2'}]"; ObjectMapper mapper = new ObjectMapper(); JavaType javaType = mapper.getTypeFactory

java 產生隨機數的方法

一、利用Math.random()方法。 需要生成一個0到99之內的隨機數,通過如下語句就可以實現: i=1+(int)(Math.Random()*100)。 其中(int)(Math.Random()*99)產生0到99的整數型隨機數。然後再加上1就是產生1到100之間的隨機整數。

Java實現websocket 的方法

一.WebSocket簡單介紹  隨著網際網路的發展,傳統的HTTP協議已經很難滿足Web應用日益複雜的需求了。近年來,隨著HTML5的誕生,WebSocket協議被提出,它實現了瀏覽器與伺服器的全雙工通訊,擴充套件了瀏覽器與服務端的通訊功能,使服務端也能主動向客戶端傳送資料。  我們知道,傳統的HTTP協議

初始化ArrayList、List方法

說明: 個人偏向第二種方法,適合沒有伺服器資料的情況下,做個簡單的list來開發 方式一: ArrayList<String> list = new ArrayList<Str

解決com.fasterxml.jackson.databind.JsonMappingException: No suitable 以 Jackson 處理複雜型別(List,map)方法

出現com.fasterxml.jackson.databind.JsonMappingException: No suitable 的情況有很多種,具體情況具體對待。 原因一: 在使用jackson 進行json字串轉java bean的時候出現如下錯誤, com.f

(好使)用Java集合中的Collections.sort方法list排序的方法

      ret = String.valueOf(m2.invoke(((E)b), null).toString().length()).compareTo(String.valueOf(m1.invoke(((E)a), null).toString().length()));          if

List集合序列排序的方法

首先講一下Comparable介面和Comparator介面,以及他們之間的差異。有助於Collections.sort()方法的使用。請參考 1.Comparable自然規則排序//在自定義類Student裡面實現Comparable介面,並重寫抽象方法compareTo(Student o);//Col

Java List去重的方法

通過Iterator遍歷,利用remove方法移除: public void testList() {    List<Integer> list=new ArrayList<Int

java中Map和List初始化的方法

第一種方法(常用方法): //初始化List List<string> list = new ArrayList</string><string>

Java Web程序中使用監聽器可以通過以下方法

output pla extend 標識 ade 介紹 gets str override 之前學習了很多涉及servlet的內容,本小結我們說一下監聽器,說起監聽器,編過桌面程序和手機App的都不陌生,常見的套路都是拖一個控件,然後給它綁定一個監聽器,即可以對該對象的事件

java打印等腰三角形的方法!(根據行數,根據底邊長度)

triangle class [] 執行 next() result scanner 1-1 next 首先來看根據用戶輸入的底邊的長度判斷: 1 package cn.edu.nwpu.java; 2 3 import java.util.Scanner; 4

MyBatis無限級分類實現的方法--自關聯與map集合

except app exce utf-8 elf findall ldr ati tex 1、這回先創建數據庫吧 下表cid是CategoryId的縮寫,cname是CategoryName的縮寫,pid是parentId的縮寫 無限級分類一般都包含這三個屬性,至少也要包

python中list轉csv的方法

方法一: name_attribute = ['NumberID','UserID','ModuleID','StartDate','EndDate','Frequent'] writerCSV=pd.DataFrame(columns=name_attribute,data=data) wr

Java實現生產者消費者模式的方法

1、 利用 Object的 wait/notify,和非阻塞佇列實現 import java.util.PriorityQueue; public class Test{ private int size=10; private PriorityQueue&

java中字串 按照字元挨個換行輸出-方法

方案1:將String 字串 轉化為char 陣列 toCharArray public static void main(String[] args) { String s="aaahssjshs222"; // 轉化為字元陣列。 char[] c=s