关于两个List集合对象去重
程序员文章站
2022-05-22 15:48:50
...
实际项目开发中,很多业务场景下都会遇见集合去重。在说到两个对象去重之前,首先我们回顾下普通类型的list如何去重,这里先说两个list自带的方法,图画的不是太好,勿喷- -!
一:retainAll()
List<String> A = new ArrayList<String>();
A.add("A");
A.add("B");
A.add("C");
A.add("D");
List<String>B = new ArrayList<String>();
B.add("C");
B.add("D");
B.add("E");
B.add("F");
List<String> C = new ArrayList<String>();
C.addAll(A);
C.retainAll(B);
System.out.println(C);
结果: [C, D]
二:removeAll()
List<String> A = new ArrayList<String>();
A.add("A");
A.add("B");
A.add("C");
A.add("D");
List<String>B = new ArrayList<String>();
B.add("C");
B.add("D");
B.add("E");
B.add("F");
List<String> C = new ArrayList<String>();
C.addAll(A);
C.removeAll(B);
System.out.println(C);
结果:[A, B]
上面的方法看完相信已经知道一大半了,其实要做到对象去重很简单,就是还要在你的entity里重写equals和hashCode方法,
不知道为什么的同学可以参照这篇文章,讲的还不错:点击打开链接 有时候,根据业务不同,可以把需要去重的条件加进去即可。举一个好吃的栗子,代码如下
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<User> A = new ArrayList<User>();
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<User> B = new ArrayList<User>();
User user4 = new User("LiMing", "1");
B.add(user4);
User user5 = new User("WangHong", "2");
B.add(user5);
List<User> distinctList = new ArrayList<User>();
distinctList.addAll(A);
distinctList.retainAll(B);
//distinctList.retainAll(B); 结果: 姓名:ZhangLiang---类型:3
for (User obj : distinctList) {System.out.println("姓名:" + obj.getName() + "---" + "类型:"+ obj.getType());}}}结果:姓名:LiMing---类型:1 姓名:WangHong---类型:2