java 集合按照某个字段去重的几种做法
时间: 2023-07-28 18:08:06 浏览: 107
Java中List集合对象去重及按属性去重的8种方法
5星 · 资源好评率100%
Java集合按照某个字段去重有多种做法,以下是其中的几种:
1. 重写对象的 equals 和 hashCode 方法
这种方法是最常见的做法,需要重写对象的 equals 和 hashCode 方法,根据指定字段的值来判断两个对象是否相等,然后使用 HashSet 去重。
示例代码:
```java
public class Person {
private String id;
private String name;
public Person(String id, String name) {
this.id = id;
this.name = name;
}
// 重写 equals 和 hashCode 方法,根据 id 值判断两个对象是否相等
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return Objects.equals(id, person.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
List<Person> list = new ArrayList<>();
list.add(new Person("1", "张三"));
list.add(new Person("2", "李四"));
list.add(new Person("1", "王五"));
Set<Person> set = new HashSet<>(list);
System.out.println(set);
```
输出结果为:
```
[Person{id='1', name='张三'}, Person{id='2', name='李四'}]
```
可以看到,根据 id 值去重成功,保留了 id 值为 1 和 2 的两个对象。
2. 使用 Java 8 的 Stream API
Java 8 的 Stream API 提供了 distinct 方法可以去重,并且可以根据指定字段去重。
示例代码:
```java
List<Person> list = new ArrayList<>();
list.add(new Person("1", "张三"));
list.add(new Person("2", "李四"));
list.add(new Person("1", "王五"));
List<Person> result = list.stream()
.filter(distinctByKey(Person::getId))
.collect(Collectors.toList());
System.out.println(result);
```
输出结果同上面的示例,根据 id 值去重成功。
其中,`distinctByKey` 是一个自定义的方法,根据指定的属性值去重:
```java
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
```
3. 使用 TreeSet
TreeSet 是一个有序的集合,可以根据指定字段进行排序和去重。需要实现 Comparable 接口,并重写 compareTo 方法。
示例代码:
```java
public class Person implements Comparable<Person> {
private String id;
private String name;
public Person(String id, String name) {
this.id = id;
this.name = name;
}
// 根据 id 值比较大小
@Override
public int compareTo(Person o) {
return this.id.compareTo(o.id);
}
}
List<Person> list = new ArrayList<>();
list.add(new Person("1", "张三"));
list.add(new Person("2", "李四"));
list.add(new Person("1", "王五"));
Set<Person> set = new TreeSet<>(list);
System.out.println(set);
```
输出结果同上面的示例,根据 id 值去重成功。
需要注意的是,TreeSet 去重是根据 compareTo 方法的返回值进行的,如果 compareTo 方法实现不正确,可能会出现去重失败的情况。
阅读全文