Java list<T> 去重复 数据
来源:互联网 发布:网络艺术研究 编辑:程序博客网 时间:2024/06/05 17:45
昨天,做项目的时候遇到需要这样将list 分组的 功能,找百度,试了很多方法,一直没有好的方法,再说功能不够强大,只是单纯的一个两个字段group by。心烦,搞到也不想再找了,然后花了两三个小时,整合了一个 List<T> 的 group by 方法,提供了两个重载,一个是只group by,另一个可以count 合并列(Integer,Long,Double,Float)是相加,String 就拼接起来。废话少说,上代码。缺包的看 import ,然后自己下载。
===========================我======是======分======割======线=========================================================
使用方法:
原list<T> lists :
[{"functiontype":23,"identifying":20,"remark":"分页大小10","systemid":0,"value":"10"},{"functiontype":23,"identifying":20,"remark":"分页大小20","systemid":0,"value":"20"},{"functiontype":23,"identifying":20,"remark":"分页大小30","systemid":0,"value":"30"},{"functiontype":23,"identifying":20,"remark":"分页大小40","systemid":0,"value":"40"},{"functiontype":23,"identifying":20,"remark":"分页大小50","systemid":0,"value":"50"},{"functiontype":24,"identifying":21,"remark":"预期5周","systemid":0,"value":"5"}]
===========================我======是======分======割======线=========================================================
调用只group by 方法:
List<SystemInstall> liSystemInstalls = systemListUtil.getListByGroup(
lists,
new String[]{"Functiontype","Identifying"});
数据如下:
[{"functiontype":23,"identifying":20,"remark":"分页大小10","systemid":0,"value":"10"},{"functiontype":24,"identifying":21,"remark":"预期5周","systemid":0,"value":"5"}]
===========================我======是======分======割======线=========================================================
需要合并count的:
List<SystemInstall> liSystemInstalls1 = systemListUtil.getListByGroup(SystemInstall.class,
lists,
new String[]{"Functiontype","Identifying"},new String[]{"Functiontype","Identifying","Value"});
得到数据如下:
[{"functiontype":115,"identifying":100,"remark":"分页大小10","systemid":0,"value":"50,40,30,20,10"},{"functiontype":24,"identifying":21,"remark":"预期5周","systemid":0,"value":"5"}]
===========================我======是======分======割======线=========================================================
其中参数为 string[] 的都是对应字段的 get 、set 方法名字,但是不需要前面的’get‘和‘set’ !!!
代码:
package com.zsm.core.util;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;import java.util.logging.Level;import java.util.logging.Logger;@SuppressWarnings("unchecked")public class ListUtil<T extends Serializable> {/** * 获得对象属性的值 get 方法*/ private static Object invokeMethod(Object owner, String methodName) throws Exception { Class ownerClass = owner.getClass();Method method = null; try {method = ownerClass.getMethod(methodName); } catch (SecurityException e) { } catch (NoSuchMethodException e) {return " can't find 'get" + methodName + "' method"; } return method.invoke(owner); } /** * @param MethodName * @param o 调用此方法的对象 * @param paras 调用的这个方法的参数参数列表 */private void invokeMethod(String MethodName,Object o,Object []paras){ Class c[]=null; if(paras!=null){//存在 int len=paras.length; c = new Class[len]; for(int i=0;i<len;++i){ c[i]=paras[i].getClass(); } } try { Method method=o.getClass().getDeclaredMethod(MethodName,c); try { method.invoke(o,paras);//调用o对象的方法 } catch (IllegalAccessException ex) { Logger.getLogger(ListUtil.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalArgumentException ex) { Logger.getLogger(ListUtil.class.getName()).log(Level.SEVERE, null, ex); } catch (InvocationTargetException ex) { Logger.getLogger(ListUtil.class.getName()).log(Level.SEVERE, null, ex); } } catch (NoSuchMethodException ex) { Logger.getLogger(ListUtil.class.getName()).log(Level.SEVERE, null, ex); } catch (SecurityException ex) { Logger.getLogger(ListUtil.class.getName()).log(Level.SEVERE, null, ex); }} /** * 该类 使用的 set 方法 */private void setMethod(String MethodName,Object o,Object []paras){invokeMethod("set" + MethodName,o,paras);} /** * 该类 使用的 get 方法 * @throws Exception */private Object getMethod(Object owner, String methodName) throws Exception{return invokeMethod(owner,"get" + methodName);} /** * List<T> group by 分组 * @list 分组 list * @groupMethodNames 需要分组的 字段的 get 方法名字 * */public List<T> getListByGroup(List<T> list,String[] groupMethodNames) throws Exception { List<T> result = new ArrayList<T>();for (T bean : list) {if (!iscontains(bean,result,groupMethodNames)) { result.add(bean); }} return result; }/** * List<T> group by 分组 * @class1 需要分组的对象 的 class * @list 分组 list * @groupMethodNames 需要分组的 字段的 get 方法名字(不需要‘get’) * @countMethodNames 需要分组后合并的 set 方法名字(不需要‘set’) * @return boolean * */public List<T> getListByGroup(Class<T> class1,List<T> list,String[] groupMethodNames,String[] countMethodNames) throws Exception {List<T> originalList = new ArrayList<T>(); List<T> result = new ArrayList<T>();Object objcount;Object objoriginal;T originalT;for (T bean : list) {if (iscontains(bean,originalList,groupMethodNames)) {int index = isindexOf(bean,originalList,groupMethodNames);for (int i = 0; i < countMethodNames.length; i++) {objcount = getMethod(bean,countMethodNames[i]);//获取 需要合并的 数据objoriginal = getMethod(result.get(index),countMethodNames[i]);//获取 原来 需要合并的 数据if (objcount instanceof Integer || objcount instanceof Double || objcount instanceof Float || objcount instanceof Long) {objcount = ((Integer) objcount).intValue()+((Integer) objoriginal).intValue();} else if (objcount instanceof String) {objcount = ((String) objcount)+","+((String) objoriginal);}//调用 set 方法 累计 countsetMethod(countMethodNames[i], result.get(index), new Object[]{objcount});} } else { originalT = myclone(bean); originalList.add(originalT); result.add(bean); }} return result; }/** * 判断是list 是否存在 与 obj 相同的 对象 * @obj 对比对象 * @elementData 判断的 list 对象 * @groupMethodNames group by 分组字段的 get 方法名(不需要‘get’) * @return boolean * */private boolean iscontains(Object obj,List<T> elementData,String[] groupMethodNames) throws Exception { return isindexOf(obj, elementData,groupMethodNames) >= 0; }/** * 获取 相同值的 第一个 index * @obj 对比对象 * @elementData 判断的 list 对象 * @groupMethodNames group by 分组字段的 get 方法名(不需要‘get’) * @return int * */private int isindexOf(Object obj,List<T> elementData,String[] groupMethodNames) throws Exception { if (obj == null) { for (int i = 0; i < elementData.size(); i++) if (elementData.get(i)==null) return i; } else { for (int i = 0; i < elementData.size(); i++) if (isequals(obj,elementData.get(i),groupMethodNames)) return i; } return -1; }/** * 判断 两个值 相等 * @obj1 对比对象1 * @obj2 对比对象2 * @groupMethodNames group by 分组字段的 get 方法名(不需要‘get’) * @return boolean * */private boolean isequals(Object obj1,Object obj2,String[] groupMethodNames) throws Exception {String str1 = "";String str2 = "";for (int i = 0; i < groupMethodNames.length; i++) {str1 = getMethod(obj1,groupMethodNames[i]).toString();str2 = getMethod(obj2,groupMethodNames[i]).toString();if(!str1.equals(str2)){return false;}} return true; }/** * Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化] * @c 需要复制的对象 * @return 复制后的对象 * */public T myclone(T c) {T outer = null;try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(c);// 将流序列化成对象ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);outer = (T) ois.readObject();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return outer;}}
- Java list<T> 去重复 数据
- Java List去重复数据
- java判断List<T>对象是否唯一、去重复
- java 中List 去重复
- java中list去重复
- java list集合去重复
- java List 去重,list去除重复
- list中去重复数据的
- 去重复数据(JAVA)
- 巧用linq在list<T>去重复,根据主键ID
- Java笔记之List集合去重复
- java List 通过hashSet去重复
- java list 数据去重
- java list 去除重复数据
- List去重复
- list 去重复项
- list 去重复
- list去重复
- 文章标题
- telnet root 登陆问题
- android中的线程机制(二)—SocketCallBack
- 为什么要使用redis数据库?
- Mac OSX10.12 上安装配置caffe(无GPU)
- Java list<T> 去重复 数据
- 搭建kindleEAR为kindle推送RSS订阅
- 【工业相机Pointgray配置VS2012】Pointgray配置VS2012并将Pointgray类型转换成Mat类型
- oc客服端向服务端传输数据的加密
- golang 设置web请求状态码
- html——跑马灯以及背景音乐的实现
- Linux环境下如何通过WMI对windows进行监控
- Struts2拦截器
- phpize找不到怎么办