天天看點

JAVA 集合 List 分組的兩種方法

實體類data

[java] view

plain copy

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;  

    public string getcontent() {  

        return content;  

    public data setcontent(string content) {  

        this.content = content;  

}  

排序類

<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!");  

        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) {  

        // 正式分組  

        listgroup2map(list, map, method);  

     * 根據類和方法名,擷取方法對象 

    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> 

     * @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);  

            // 開始分組  

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

            system.out.print("分組失敗!");  

測試類

import java.util.linkedhashmap;  

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 + "毫秒!");