Lista = new ArrayList (); a.add("2"); a.add("4"); a.add("5"); a.add("6"); List b = new ArrayList (); b.add("2"); b.add("3"); b.add("6"); b.add("7");
1.集合自带的api
这种方式看似挺方便 , 但是其底层还是遍历的去重 , 如果数据量太大还是不建议使用
public static void sortListTwo(Lista, List b) { System.out.println("removeAll***************************"); a.removeAll(b); a.addAll(b); for (String str2 : a) { System.out.println(str2); } }
2.Set 方式 , 其本身就是不重复的集合
public static void sortListOne(Lista, List b) { System.out.println("HashSet****************"); Set set = new HashSet (); set.addAll(a); set.addAll(b); List c = new ArrayList (set); for (String str : c) { System.out.println(str); } }
3.Map 方式 , key 是唯一的
这种方式可以去重 ,但是需要遍历两个list , 还是较为繁琐
public static void sortListFree(Lista, List b) { System.out.println("Map***************************"); Map map = new HashMap (); for (String str : a) { map.put(str, str); } for (String str1 : b) { map.put(str1, str1); } for(Map.Entry entry : map.entrySet()){ System.out.println(entry.getKey()+":"+entry.getValue()); } }
注意:以上的几种方式都是针对的基本数据类型 , 如果是对象的话会有一些问题
关于两个List集合对象去重
在说到两个对象去重之前,首先我们回顾下普通类型的list如何去重,这里先说两个list自带的方法,图画的不是太好。
一:retainAll()
ListA = new ArrayList (); A.add("A"); A.add("B"); A.add("C"); A.add("D"); List B = new ArrayList (); B.add("C"); B.add("D"); B.add("E"); B.add("F"); List C = new ArrayList (); C.addAll(A); C.retainAll(B); System.out.println(C); 结果: [C, D]
二:removeAll()
ListA = new ArrayList (); A.add("A"); A.add("B"); A.add("C"); A.add("D"); List B = new ArrayList (); B.add("C"); B.add("D"); B.add("E"); B.add("F"); List C = new ArrayList (); C.addAll(A); C.removeAll(B); System.out.println(C); 结果:[A, B]
上面的方法看完相信已经知道一大半了,其实要做到对象去重很简单,就是还要在你的entity里重写equals和hashCode方法,
不知道为什么的同学可以参照这篇文章,讲的还不错:java为什么要重写hashCode和equals方法
点击打开链接 有时候,根据业务不同,可以把需要去重的条件加进去即可。举一个好吃的栗子,代码如下
entity:
public class User {
private String name;
private Integer age;
private String type;
// Setters and Getters 省略get&set方法.
//方便测试,写出有参构造,默认时无参.
public User(String name,String type,int age){
this.name = name;
this.type = type;
}
//eclipse快捷键shift+alt+s自动生成(默认实体类的所有属性)。 下边的重写方法只是根据姓名和类型来判断去重,业务不同写法不同
@Override
public int hashCode() {
String result = name+type;
return result.hashCode();
}
@Override
public boolean equals(Object obj) {
User u = (User)obj;
return this.getName().equals(u.getName()) && (this.getType().equals(u.getType()));
}
}
test:
public class UserDistinctTest {
public static void main(String[] args) {
List A = new ArrayList();
User user1 = new User("LiMing", "1");
A.add(user1);
User user2 = new User("WangHong", "2");
A.add(user2);
User user3 = new User("ZhangLiang", "3");
A.add(user3);
List B = new ArrayList();
User user4 = new User("LiMing", "1");
B.add(user4);
User user5 = new User("WangHong", "2");
B.add(user5);
List distinctList = new ArrayList();
distinctList.addAll(A);
distinctList.retainAll(B);
//distinctList.removeAll(B); 结果: 姓名:ZhangLiang---类型:3
for (User obj : distinctList) {
System.out.println("姓名:" + obj.getName() + "---" + "类型:"+ obj.getType());
}
}
}
结果:姓名:LiMing---类型:1 姓名:WangHong---类型:2



