1. 集合List去重
List是有序的,可以重複的。Set是無序的,不可以重複的。List去重,如果T是基本類型的,只需要將List轉成Set就可以去重;如果T是對象類型,那麼需要重新equals()和hashCode()方法。
1.1 基本類型
假如有一個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");
1.1.1 List< String>轉Set< String>去重
通過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);
1.1.2 jdk8的新語法操作List< String>去重
List<String> list2 = list.stream().distinct().collect(Collectors.toList());
System.out.println("list2="+list2);
這樣操作後新的list集合list2的順序和list裏面的順序一致
1.2 對象類型
對象類型,需要重新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);
1.2.1 List< User>轉Set< User>去重
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);
1.2.2 使用jdk8新語法List< User>去重
重寫equals()和hashCode()方法
List<User> list2 = list.stream().distinct().collect(Collectors.toList());
System.out.println("list2="+list2);