JAVA 集合 List 分组的两种方法

CSDN日报20170219——《程序员的沟通之痛》      【技术直播】揭开人工智能神秘的面纱        程序员1月书讯     云端应用征文大赛,秀绝招,赢无人机!

JAVA 集合 List 分组的两种方法

2243人阅读 评论(0) 收藏 举报 本文章已收录于: category_icon.jpg 分类: JAVASE学习笔记(22) arrow_triangle%20_down.jpg arrow_triangle_up.jpg 作者同类文章 X

从网上找了两种方法,效率差不多,这里贴出代码供大家参考

实体类Data

[java] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class Data {  
  2.   
  3.     private Long id ;  
  4.     private Long courseId ;  
  5.     private String content ;  
  6.   
  7.     public Long getId() {  
  8.         return id;  
  9.     }  
  10.   
  11.     public Data setId(Long id) {  
  12.         this.id = id;  
  13.         return this ;  
  14.     }  
  15.   
  16.     public Long getCourseId() {  
  17.         return courseId;  
  18.     }  
  19.   
  20.     public Data setCourseId(Long courseId) {  
  21.         this.courseId = courseId;  
  22.         return this ;  
  23.     }  
  24.   
  25.     public String getContent() {  
  26.         return content;  
  27.     }  
  28.   
  29.     public Data setContent(String content) {  
  30.         this.content = content;  
  31.         return this ;  
  32.     }  
  33.       
  34. }  
save_snippets.png
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 ;}}

排序类

[java] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. "code" class="java">import java.lang.reflect.Method;  
  2. import java.util.ArrayList;  
  3. import java.util.Collection;  
  4. import java.util.HashMap;  
  5. import java.util.Iterator;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. import com.framework.util.ParamUtils;  
  10.   
  11. public class CommonUtils {  
  12.   
  13.     /** 
  14.      * 分組依據接口,用于集合分組時,獲取分組依據 
  15.      *  
  16.      * @author ZhangLiKun 
  17.      * @title GroupBy 
  18.      * @date 2013-4-23 
  19.      */  
  20.     public interface GroupBy {  
  21.         T groupby(Object obj);  
  22.     }  
  23.   
  24.     /** 
  25.      *  
  26.      * @param colls 
  27.      * @param gb 
  28.      * @return 
  29.      */  
  30.     public static final extends Comparable, D> Map> group(Collection colls, GroupBy gb) {  
  31.         if (colls == null || colls.isEmpty()) {  
  32.             System.out.println("分組集合不能為空!");  
  33.             return null;  
  34.         }  
  35.         if (gb == null) {  
  36.             System.out.println("分組依據接口不能為Null!");  
  37.             return null;  
  38.         }  
  39.         Iterator iter = colls.iterator();  
  40.         Map> map = new HashMap>();  
  41.         while (iter.hasNext()) {  
  42.             D d = iter.next();  
  43.             T t = gb.groupby(d);  
  44.             if (map.containsKey(t)) {  
  45.                 map.get(t).add(d);  
  46.             } else {  
  47.                 List list = new ArrayList();  
  48.                 list.add(d);  
  49.                 map.put(t, list);  
  50.             }  
  51.         }  
  52.         return map;  
  53.     }  
  54.     /** 
  55.      * 将List按照V的methodName方法返回值(返回值必须为K类型)分组,合入到Map>中
     
  56.      * 要保证入参的method必须为V的某一个有返回值的方法,并且该返回值必须为K类型 
  57.      *  
  58.      * @param list 
  59.      *            待分组的列表 
  60.      * @param map 
  61.      *            存放分组后的map 
  62.      * @param clazz 
  63.      *            泛型V的类型 
  64.      * @param methodName 
  65.      *            方法名 
  66.      */  
  67.     public static  void listGroup2Map(List list, Map> map, Class clazz, String methodName) {  
  68.         // 入参非法行校验  
  69.         if (null == list || null == map || null == clazz || !ParamUtils.chkString(methodName)) {  
  70.             System.out.print("CommonUtils.listGroup2Map 入参错误,list:" + list + " ;map:" + map + " ;clazz:" + clazz + " ;methodName:" + methodName);  
  71.             return;  
  72.         }  
  73.   
  74.         // 获取方法  
  75.         Method method = getMethodByName(clazz, methodName);  
  76.         // 非空判断  
  77.         if (null == method) {  
  78.             return;  
  79.         }  
  80.   
  81.         // 正式分组  
  82.         listGroup2Map(list, map, method);  
  83.     }  
  84.     /** 
  85.      * 根据类和方法名,获取方法对象 
  86.      *  
  87.      * @param clazz 
  88.      * @param methodName 
  89.      * @return 
  90.      */  
  91.     public static Method getMethodByName(Class clazz, String methodName) {  
  92.         Method method = null;  
  93.         // 入参不能为空  
  94.         if (null == clazz || !ParamUtils.chkString(methodName)) {  
  95.             System.out.print("CommonUtils.getMethodByName 入参错误,clazz:" + clazz + " ;methodName:" + methodName);  
  96.             return method;  
  97.         }  
  98.   
  99.         try {  
  100.             method = clazz.getDeclaredMethod(methodName);  
  101.         } catch (Exception e) {  
  102.             System.out.print("类获取方法失败!");  
  103.         }  
  104.   
  105.         return method;  
  106.     }  
  107.     /** 
  108.      * 将List按照V的某个方法返回值(返回值必须为K类型)分组,合入到Map>中
     
  109.      * 要保证入参的method必须为V的某一个有返回值的方法,并且该返回值必须为K类型 
  110.      *  
  111.      * @param list 
  112.      *            待分组的列表 
  113.      * @param map 
  114.      *            存放分组后的map 
  115.      * @param method 
  116.      *            方法 
  117.      */  
  118.     @SuppressWarnings("unchecked")  
  119.     public static  void listGroup2Map(List list, Map> map, Method method) {  
  120.         // 入参非法行校验  
  121.         if (null == list || null == map || null == method) {  
  122.             System.out.print("CommonUtils.listGroup2Map 入参错误,list:" + list + " ;map:" + map + " ;method:" + method);  
  123.             return;  
  124.         }  
  125.   
  126.         try {  
  127.             // 开始分组  
  128.             Object key;  
  129.             List listTmp;  
  130.             for (V val : list) {  
  131.                 key = method.invoke(val);  
  132.                 listTmp = map.get(key);  
  133.                 if (null == listTmp) {  
  134.                     listTmp = new ArrayList();  
  135.                     map.put((K) key, listTmp);  
  136.                 }  
  137.                 listTmp.add(val);  
  138.             }  
  139.         } catch (Exception e) {  
  140.             System.out.print("分组失败!");  
  141.         }  
  142.     }  
  143.   
  144. }  
save_snippets.png
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 groupby(Object obj);}/*** * @param colls* @param gb* @return*/public static final , D> Map> group(Collection colls, GroupBy gb) {if (colls == null || colls.isEmpty()) {System.out.println("分組集合不能為空!");return null;}if (gb == null) {System.out.println("分組依據接口不能為Null!");return null;}Iterator iter = colls.iterator();Map> map = new HashMap>();while (iter.hasNext()) {D d = iter.next();T t = gb.groupby(d);if (map.containsKey(t)) {map.get(t).add(d);} else {List list = new ArrayList();list.add(d);map.put(t, list);}}return map;}/*** 将List按照V的methodName方法返回值(返回值必须为K类型)分组,合入到Map>中
* 要保证入参的method必须为V的某一个有返回值的方法,并且该返回值必须为K类型* * @param list* 待分组的列表* @param map* 存放分组后的map* @param clazz* 泛型V的类型* @param methodName* 方法名*/public static void listGroup2Map(List list, Map> map, Class 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的某个方法返回值(返回值必须为K类型)分组,合入到Map>中
* 要保证入参的method必须为V的某一个有返回值的方法,并且该返回值必须为K类型* * @param list* 待分组的列表* @param map* 存放分组后的map* @param method* 方法*/@SuppressWarnings("unchecked")public static void listGroup2Map(List list, Map> 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 listTmp;for (V val : list) {key = method.invoke(val);listTmp = map.get(key);if (null == listTmp) {listTmp = new ArrayList();map.put((K) key, listTmp);}listTmp.add(val);}} catch (Exception e) {System.out.print("分组失败!");}}}


 
测试类

[java] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. import java.util.ArrayList;  
  2. import java.util.LinkedHashMap;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import com.framework.common.CommonUtils.GroupBy;  
  7.   
  8. public class Test {  
  9.   
  10.     /** 
  11.      * @param args 
  12.      */  
  13.     public static void main(String[] args) {  
  14.         // 准备一个集合  
  15.   
  16.         final int loop = 1000 * 1000;  
  17.         List list = new ArrayList(); // size=8 * loop  
  18.         for (int i = 0; i < loop; i++) {  
  19.             list.add(new Data().setId(1L).setCourseId(200010L).setContent("AAA"));  
  20.             list.add(new Data().setId(2L).setCourseId(200010L).setContent("BBB"));  
  21.             list.add(new Data().setId(3L).setCourseId(200011L).setContent("CCC"));  
  22.             list.add(new Data().setId(4L).setCourseId(200011L).setContent("DDD"));  
  23.             list.add(new Data().setId(5L).setCourseId(200010L).setContent("EEE"));  
  24.             list.add(new Data().setId(6L).setCourseId(200011L).setContent("FFF"));  
  25.             list.add(new Data().setId(7L).setCourseId(200010L).setContent("GGG"));  
  26.             list.add(new Data().setId(8L).setCourseId(200012L).setContent("HHH"));  
  27.         }  
  28.         // 进行分组 1  
  29.         long time = System.currentTimeMillis();  
  30.         Map> map2 = new LinkedHashMap>();  
  31.         CommonUtils.listGroup2Map(list, map2, Data.class"getId");// 输入方法名  
  32.           
  33.         long duration = System.currentTimeMillis() - time;  
  34.   
  35.         System.out.println("分组一执行:" + duration + "毫秒!");  
  36.   
  37.         // 分组二  
  38.         time = System.currentTimeMillis();  
  39.         Map> map = CommonUtils.group(list, new GroupBy() {  
  40.             @Override  
  41.             public Long groupby(Object obj) {  
  42.                 Data d = (Data) obj;  
  43.                 return d.getCourseId(); // 分组依据为课程ID  
  44.             }  
  45.         });  
  46.   
  47.         duration = System.currentTimeMillis() - time;  
  48.   
  49.         System.out.println("分组二执行:" + duration + "毫秒!");  
  50.   
  51.     }  
  52.   
  53. }  
save_snippets.png
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 list = new ArrayList(); // size=8 * loopfor (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"));}// 进行分组 1long time = System.currentTimeMillis();Map> map2 = new LinkedHashMap>();CommonUtils.listGroup2Map(list, map2, Data.class, "getId");// 输入方法名long duration = System.currentTimeMillis() - time;System.out.println("分组一执行:" + duration + "毫秒!");// 分组二time = System.currentTimeMillis();Map> map = CommonUtils.group(list, new GroupBy() {@Overridepublic Long groupby(Object obj) {Data d = (Data) obj;return d.getCourseId(); // 分组依据为课程ID}});duration = System.currentTimeMillis() - time;System.out.println("分组二执行:" + duration + "毫秒!");}}


1
0

我的同类文章

JAVASE学习笔记(22) http://blog.csdn.net
  • Thumbnails操作图片发红的问题解决2016-08-17阅读342
  • jsonlib json,xml,object 互转2013-01-11阅读1839
  • JAVA批量修改文本文件内容,支持子目录2012-12-03阅读3593
  • java和oracle日期互转2012-03-09阅读5933
  • 对BigDecimal常用方法的归类2012-03-06阅读233
  • poi excel 多级联动2013-08-22阅读1818
  • java获得网页源代码2013-01-10阅读338
  • properties配置文件操作实例2012-03-13阅读543
  • java与oracle日期格式2012-03-09阅读1471
  • 日期转换2012-03-02阅读174
更多文章

参考知识库

img

Java SE知识库

22367关注|468收录

img

Java EE知识库

14983关注|1233收录

img

Java 知识库

22977关注|1441收录

img

软件测试知识库

3613关注|310收录

更多资料请参考: 猜你在找 java语言从入门到精通2016+项目实训 JavaScript面向对象的编程视频课程第二季 对象 深入浅出Java的反射 java核心技术精讲 零基础学Java系列从入门到精通 HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 Java 运行时监控第 3 部分 监控应用程序生态系统的性能与可用性 Java 运行时监控第 3 部分 监控应用程序生态系统的性能与可用性 JAVA 笔记三 从源码深入浅出集合框架 Java面试题整理 关闭 查看评论
  暂无评论

您还没有登录,请 [登录]或 [注册] * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 快速回复 TOP
核心技术类目
全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬件 Docker OpenStack VPN Spark ERP IE10 Eclipse CRM JavaScript 数据库 Ubuntu NFC WAP jQuery BI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap

转载于:https://www.cnblogs.com/jobs-lgy/p/6424058.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部