List<String> a = new ArrayList<String>();
a.add("2");
a.add("4");
a.add("5");
a.add("6");
List<String> b = new ArrayList<String>();
b.add("2");
b.add("3");
b.add("6");
b.add("7");
1.集合自带的api
这种方式看似挺方便 , 但是其底层还是遍历的去重 , 如果数据量太大还是不建议使用
public static void sortListTwo(List<String> a, List<String> 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(List<String> a, List<String> b) {
System.out.println("HashSet****************");
Set<String> set = new HashSet<String>();
set.addAll(a);
set.addAll(b);
List<String> c = new ArrayList<String>(set);
for (String str : c) {
System.out.println(str);
}
}
3.Map 方式 , key 是唯一的
这种方式可以去重 ,但是需要遍历两个list , 还是较为繁琐
public static void sortListFree(List<String> a, List<String> b) {
System.out.println("Map***************************");
Map<String, Object> map = new HashMap<String, Object>();
for (String str : a) {
map.put(str, str);
}
for (String str1 : b) {
map.put(str1, str1);
}
for(Map.Entry<String , Object> entry : map.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
注意:以上的几种方式都是针对的基本数据类型 , 如果是对象的话会有一些问题
在说到两个对象去重之前,首先我们回顾下普通类型的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方法,
不知道为什么的同学可以参照这篇文章,讲的还不错: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<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.removeAll(B); 结果: 姓名:ZhangLiang---类型:3
for (User obj : distinctList) {
System.out.println("姓名:" + obj.getName() + "---" + "类型:"+ obj.getType());
}
}
}
结果:姓名:LiMing---类型:1 姓名:WangHong---类型:2
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_43842093/article/details/122116735
内容来源于网络,如有侵权,请联系作者删除!