List是有序的,可以重复的。Set是无序的,不可以重复的。List去重,如果T是基本类型的,只需要将List转成Set就可以去重;如果T是对象类型,那么需要重新equals()和hashCode()方法。
假如有一个List集合[Simon, kevin, lucy, kevin, lily]
,去掉其中重复的元素kevin
。
List<String> list = new ArrayList<>();
list.add("Simon");
list.add("kevin");
list.add("lucy");
list.add("kevin");
list.add("lily");
通过List转Set去重,然后存到一个新的List集合list3里面
Set<String> set = new HashSet<>(list);
List<String> list3 = new ArrayList<>(set);
System.out.println("list3="+list3);
这样去重后的问题:新的集合lis3t和原来的list集合里面元素的顺序不一致
。
要让去重后的List集合和原来的List集合一致,可以如下操作:
先foreache list集合,然后去set.add()判断,如果add()方法返回为true便给新的list集合去添加这个元素。
具体的实现代码如下:
Set<String> set2 = new HashSet<>();
List<String> list4 = new ArrayList<>();
for(String str : list) {
if(set2.add(str)) {
list4.add(str);
}
}
System.out.println("list4="+list4);
List<String> list2 = list.stream().distinct().collect(Collectors.toList());
System.out.println("list2="+list2);
这样操作后新的list集合list2的顺序和list里面的顺序一致
对象类型,需要重新equals()和hashCode()方法,才能够判断出来两个对象是同一个对象,然后给去重。
public class User {
private String name;
private int age;
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;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
String str = name + age;
return str.hashCode();
}
@Override
public boolean equals(Object obj) {
User user = (User)obj;
return name.equals(user.name) && age==user.age;
}
}
需要去重的List集合List< User >:
List<User> list = new ArrayList<User>() {{
add(new User("Simon", 24));
add(new User("kevin", 28));
add(new User("lucy", 23));
add(new User("kevin", 28));
add(new User("lily", 27));
}};
System.out.println("list="+list);
Set<User> set = new HashSet<>(list);
System.out.println(set);
List<User> list3 = new ArrayList<>();
list3.addAll(set);
System.out.println("list3="+list3);
这样操作是去重了,但是集合list3的顺序和集合list的不一致
。
要让去重后的集合和list集合顺序一致,可以如下操作:
Set<User> set2 = new HashSet<>();
List<User> list4 = new ArrayList<>();
for (User user : list) {
if(set2.add(user)) {
list4.add(user);
}
}
System.out.println("list4="+list4);
重写equals()和hashCode()方法
List<User> list2 = list.stream().distinct().collect(Collectors.toList());
System.out.println("list2="+list2);