list排序,list去重

来源:互联网 发布:cdp 知乎 编辑:程序博客网 时间:2024/05/21 10:02

List去重/排序的通用方法



package com.ck.test.util;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.text.Collator;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashSet;import java.util.List;/** * List去重/排序的通用方法 *  * @author CK *  * @param <T> T对象 */public class ListSort<T> {/** *  * @param list对象 要排序的集合 * @param method 要排序的实体的属性所对应的get方法 * @param sort desc 倒序、asc升序、""为原样   */public void Sort(List<T> list, final String method, final String sort) {// 用内部类实现排序Collections.sort(list, new Comparator<T>() {public int compare(T a, T b) {int ret = 0;try {// 获取m1的方法名Method m1 = a.getClass().getMethod(method, null);// 获取m2的方法名Method m2 = b.getClass().getMethod(method, null);if(sort != null && "desc".equals(sort)) {ret = m2.invoke(((T)b), null).toString().compareTo(m1.invoke(((T)a),null).toString());} else {// 正序排序ret = m1.invoke(((T)a), null).toString().compareTo(m2.invoke(((T)b), null).toString());}} catch (NoSuchMethodException ne) {System.out.println(ne);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return ret;}});}/** * 重复的选中其一以及其他不重复的对象保留,并进行排序 * @param list 要处理的list对象 * @param method 排序对象字段的getxxx()方法名,即getxxx * @param sort  desc/DESC 倒序、asc/ASC升序、""为原样   * @return */public List<T> sortObjDistinctList(List<T> list, final String method, final String sort) {List<T> listWithoutDup = null;listWithoutDup = distinctListValue(list);if(sort != null && ("desc".equals(sort) || "DESC".equals(sort) || "ASC".equals(sort) || "asc".equals(sort))) {// 排序Sort(listWithoutDup, method, sort);} else {return listWithoutDup;}return listWithoutDup;}/** * 去重,返回重复的数据 * @param list * @return */public List<T> sortDistinct2Other(List<T> list) {// 重复数据List<T> list2 = new ArrayList<>();// 使用hashset去重复,set为重复的集合,可以通过new ArrayList(set)转换成listHashSet<T> set = new HashSet<>();// 去掉重复的值,只保留其他不重复的对象for (T t : list) {boolean add = set.add(t);if (!add) {list2.add(t);}}return list2;}/** * 除重  去掉重复的值,并保留重复值中一个值及其他不重复的值 * @param list 处理list * @return  */public List<T> distinctListValue(List<T> list) {List<T> listWithoutDup = new ArrayList<T>(new HashSet<T>(list));return listWithoutDup;}/** *  * @param list 处理list * @param sort desc/DESC 倒序、asc/ASC升序、""为原样   * @param flag true-除重;false-不除重 * @return */public List<T> distinctListASCorDesc(List<T> list, final String sort, boolean flag) {List<T> listWithoutDup = null;if(flag) {listWithoutDup = distinctListValue(list);} else { listWithoutDup = list;}if(sort != null && ("ASC".equals(sort) || "asc".equals(sort))) {// 升序Collections.sort(listWithoutDup,Collator.getInstance(java.util.Locale.CHINA));//注意:是根据的汉字的拼音的字母排序的,而不是根据汉字一般的排序方法} else if(sort != null && ("desc".equals(sort) || "DESC".equals(sort))) {// 降序Collections.reverse(listWithoutDup);//不指定排序规则时,也是按照字母的来排序的} else {return listWithoutDup;}return listWithoutDup;}}
package com.ck.test.modal;/** * 这里id,name,age相同则Student相同, * 若有其他相同 * @author Administrator * */public class Student {int id;    String name;    int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + id;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;if (age != other.age)return false;if (id != other.id)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}public Student(int id, String name, int age) {super();this.id = id;this.name = name;this.age = age;}@Overridepublic String toString() {return "(" + id + ", " + name + ", " + age + ")";//return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";}    }


package com.ck.test;import java.text.Collator;import java.util.ArrayList;import java.util.Arrays;import java.util.Collection;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Random;import java.util.Set;import org.junit.Assert;import org.junit.Test;import com.ck.test.modal.Student;import com.ck.test.util.ListSort;/* * 对list去重 *  */public class TestList {//去除set中重复数据的方法private static Set<Student> removeDuplicate(Set<Student> set) {    Map<String, Student> map = new HashMap<String, Student>();    Set<Student> tempSet = new HashSet<Student>();         for(Student p : set) {              if(map.get(p.getName()) == null ) {                   map.put(p.getName(), p);                                      } else {                   tempSet.add(p);              }          }    set.removeAll(tempSet);    return set;}public static String outCollection(Collection coll) {         StringBuffer sb = new StringBuffer();         for (Object obj : coll) {             sb.append(obj + "," );         }        System.out.println(sb.toString());         return sb.toString();     } /* * 对list去重 list with dup:[1, 2, 3, 1] list without dup:[3, 2, 1] */@Testpublic void distinctListValue() {List<String> listWithDup = new ArrayList<String>();listWithDup.add("1");listWithDup.add("2");listWithDup.add("4");listWithDup.add("3");listWithDup.add("1");List<String> listWithoutDup = new ArrayList<String>(new HashSet<String>(listWithDup));System.out.println("list with dup:" + listWithDup);System.out.println("list without dup:" + listWithoutDup);System.out.println("list去重后(去掉重复的值,并保留重复值中一个值及其他不重复的值/排序) :\n" + (new ListSort<String>()).distinctListValue(listWithDup));Collections.sort(listWithoutDup); Collections.reverse(listWithoutDup);  //按照age降序 23,22   System.out.println(listWithoutDup);}@Testpublic void test2() {List<String> list = new ArrayList();list.add("王硕");list.add("刘媛媛");list.add("李明1");list.add("李明2");list.add("李明");list.add("刘迪");list.add("刘布2");list.add("李明");list.add("刘布8");list.add("刘布");list.add("刘布");list.add("3");list.add("4");list.add("4");list.add("2");list.add("4");list.add("1");System.out.println((new ListSort<String>()).distinctListValue(list));for(int i=0;i<list.size();i++) {System.out.print(list.get(i) +",");}System.out.println("");//升序Collections.sort(list,Collator.getInstance(java.util.Locale.CHINA));//注意:是根据的汉字的拼音的字母排序的,而不是根据汉字一般的排序方法for(int i=0;i<list.size();i++) {    System.out.print(list.get(i) +",");}System.out.println("");//降序Collections.reverse(list);//不指定排序规则时,也是按照字母的来排序的for(int i=0;i<list.size();i++) {     System.out.print(list.get(i) +",");}}/** * 取出list中重复的Student对象 */@Testpublic void ObtainListEquals() {// 原始数据List<Student> list = new ArrayList<>();// 重复数据List<Student> list2 = new ArrayList<>();// 填充for (int i = 0; i < 10; i++) {list.add(new Student(i, "_" + i, 18 + i));Random random = new Random();if (random.nextBoolean()) {list.add(new Student(i, "_" + i, 18 + i));}}// 使用hashset去重复,set为重复的集合,可以通过new ArrayList(set)转换成listHashSet<Student> set = new HashSet<>();// 去掉重复的值,只保留其他不重复的对象for (Student student : list) {boolean add = set.add(student);if (!add) {list2.add(student);}}List<Student> listWithoutDup = new ArrayList<Student>(new HashSet<Student>(list));System.out.println("list初始化:\n" + list);System.out.println("list去重后(重复的对象):\n" + list2);System.out.println("list去重后(去掉重复的值,并保留重复值中一个值及其他不重复的值):\n" + listWithoutDup);System.out.println("list去重后(去掉重复的值,并保留重复值中一个值及其他不重复的值/排序) :\n" + (new ListSort<Student>()).sortObjDistinctList(list, "getId", "desc"));ListSort<Student> listSort= new ListSort<Student>();  // 排序        listSort.Sort(listWithoutDup, "getId", "");//        listSort.Sort(listWithoutDup, "getId", "");                System.out.println("list去重后(去掉重复的值,并保留重复值中一个值及其他不重复的值) 排序:\n" + listWithoutDup);        Set<Student> set2 = new HashSet<Student>(list);System.out.println("list without dup:" + removeDuplicate(set2));// 比较Assert.assertEquals(list.size(), list2.size() + set.size());}}



结果:
[刘布2, 刘布8, 刘媛媛, 王硕, 3, 2, 1, 4, 刘布, 李明, 刘迪, 李明1, 李明2]
王硕,刘媛媛,李明1,李明2,李明,刘迪,刘布2,李明,刘布8,刘布,刘布,3,4,4,2,4,1,
1,2,3,4,4,4,李明,李明,李明1,李明2,刘布,刘布,刘布2,刘布8,刘迪,刘媛媛,王硕,
王硕,刘媛媛,刘迪,刘布8,刘布2,刘布,刘布,李明2,李明1,李明,李明,4,4,4,3,2,1,list初始化:
[(0, _0, 18), (1, _1, 19), (1, _1, 19), (2, _2, 20), (3, _3, 21), (4, _4, 22), (4, _4, 22), (5, _5, 23), (5, _5, 23), (6, _6, 24), (6, _6, 24), (7, _7, 25), (7, _7, 25), (8, _8, 26), (9, _9, 27), (9, _9, 27)]
list去重后(重复的对象):
[(1, _1, 19), (4, _4, 22), (5, _5, 23), (6, _6, 24), (7, _7, 25), (9, _9, 27)]
list去重后(去掉重复的值,并保留重复值中一个值及其他不重复的值):
[(9, _9, 27), (3, _3, 21), (2, _2, 20), (8, _8, 26), (0, _0, 18), (5, _5, 23), (7, _7, 25), (1, _1, 19), (6, _6, 24), (4, _4, 22)]
list去重后(去掉重复的值,并保留重复值中一个值及其他不重复的值/排序) :
[(9, _9, 27), (8, _8, 26), (7, _7, 25), (6, _6, 24), (5, _5, 23), (4, _4, 22), (3, _3, 21), (2, _2, 20), (1, _1, 19), (0, _0, 18)]
list去重后(去掉重复的值,并保留重复值中一个值及其他不重复的值) 排序:
[(0, _0, 18), (1, _1, 19), (2, _2, 20), (3, _3, 21), (4, _4, 22), (5, _5, 23), (6, _6, 24), (7, _7, 25), (8, _8, 26), (9, _9, 27)]
list without dup:[(9, _9, 27), (3, _3, 21), (2, _2, 20), (8, _8, 26), (0, _0, 18), (5, _5, 23), (7, _7, 25), (1, _1, 19), (6, _6, 24), (4, _4, 22)]
list with dup:[1, 2, 4, 3, 1]
list without dup:[3, 2, 1, 4]
list去重后(去掉重复的值,并保留重复值中一个值及其他不重复的值/排序) :
[3, 2, 1, 4]
[4, 3, 2, 1]


原创粉丝点击