List去重你真的了解吗
引言
相信大家在开发中都遇到过List去掉重复数据的问题,下面我就问大家总一些方法,可能不是效率特别高的方法,都可以参考下!
单个List去重
- 手动创建一个List对象
List<Integer> list = new ArrayList<>();
list.add(24);
list.add(39);
list.add(5);
list.add(40);
list.add(39);
list.add(25);
list.add(238);
list.add(25);
方法一:使用java8新特性stream进行List去重
List<Integer> newList = (List<Integer>) list.stream().distinct().collect(Collectors.toList());
System.out.println("java8新特性stream去重:" + newList); //distinct()去重的方法
方法二:双重for循环去重
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size(); j++) {
if (i != j && list.get(i) == list.get(j)) {
list.remove(list.get(j));
}
}
}
System.out.println("双重for循环去重:" + list);
方法三:set集合判断去重,不打乱顺序
Set<Integer> set1 = new HashSet<>();
List<Integer> newList1 = new ArrayList<>();
for (Integer integer : list) {
if (set1.add(integer)) {
newList1.add(integer);
}
}
list = newList1;
System.out.println("set集合判断去重:" + list);
方法四:遍历后判断赋给另一个list集合
List<Integer> newList2 = new ArrayList<>();
for (Integer integer : list) {
if (!newList2.contains(integer)) {
newList2.add(integer);
}
}
System.out.println("赋值新list去重:" + newList2);
方法五:set和list转换去重
Set<Integer> set2 = new HashSet<>();
List<Integer> newList3 = new ArrayList<>();
set2.addAll(list);
newList3.addAll(set2);
System.out.println("set和list转换去重:" + newList3);
两个List去重
- 构建两个List对象
List<String> A = new ArrayList<String>();
A.add("X");
A.add("U");
A.add("E");
A.add("Q");
A.add("I");
List<String>B = new ArrayList<String>();
B.add("Q");
B.add("M");
B.add("I");
B.add("A");
B.add("O");
需求一:取出两个List对象重复的数据(交集)
List<String> C = new ArrayList<String>();
//C集合中一次性添加全部A集合中的数据
C.addAll(A);
//retainAll为JAVA中取交集的方法
C.retainAll(B);
System.out.println(C);
需求二:取出在A中所有数据并去掉在B中也存在的数据
List<String> D = new ArrayList<String>();
//D集合中一次性添加全部A集合中的数据
D.addAll(A);
//删除D集合中B集合中也存在的数据(removeAll从列表中移除指定 collection 中包含的其所有元素)
D.removeAll(B);
System.out.println(D);
两个List对象去重
- User对象类(注意要生成getter setter hashCode equals方法)
public class User {
//eclipse快捷键shift+alt+s自动生成(默认实体类的所有属性)注意生成getter setter hashCode equals 方法
private String name;
private Integer age;
private String type;
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", type=" + type + "]";
}
public User(String name, String type) {
super();
this.name = name;
this.type = type;
}
}
- 创建两个User对象
List<User> A = new ArrayList<User>();
User user1 = new User("xue", "2");
A.add(user1);
User user2 = new User("qi", "22");
A.add(user2);
User user3 = new User("miao", "22");
A.add(user3);
List<User> B = new ArrayList<User>();
User user4 = new User("qi", "22");
B.add(user4);
User user5 = new User("miao", "5");
B.add(user5);
场景一:找出重复的User
List<User> distinctList = new ArrayList<User>();
distinctList.addAll(A);
distinctList.retainAll(B);//retainAll为JAVA中取交集的方法
for (User obj : distinctList) {
System.out.println("姓名:" + obj.getName() + "---" + "类型:" + obj.getType());
}
场景二:去掉重复的User
List<User> distinctList2 = new ArrayList<User>();
distinctList2.addAll(A);
distinctList2.removeAll(B);//removeAll从列表中移除指定 collection 中包含的其所有元素
for (User obj : distinctList2) {
System.out.println("姓名:" + obj.getName() + "---" + "类型:" + obj.getType());
}
场景三:去掉A中类型与B中类型一样的数据
//循环取出B中的类型作为Key(一般在真实项目中会封装工具类)
for (User user : B) {
userMap.put(user.getType(), user);
}
for(User user : A) {
//如果A中的类型在userMap中找不到对应的Key就将User对象加入distinctList3中
if(!userMap.containsKey(user.getType())) {
distinctList3.add(user);
}
}
for(User user : distinctList3) {
System.out.println(user);
}
下期再见。。。