List集合去重方法
在Java中,对List集合去重有多种方法,以下是一些常见的实现方式:
-
使用HashSet(无序去重):
1
2
3List<String> listWithDuplicates = ...; // 假设这是包含重复元素的列表
Set<String> set = new HashSet<>(listWithDuplicates);
List<String> distinctList = new ArrayList<>(set);这种方法利用了HashSet自动去除重复元素的特性。先将List转换为HashSet,然后创建一个新的ArrayList来存储不重复的元素。
-
使用LinkedHashSet(有序去重):
1
2
3List<String> listWithDuplicates = ...;
LinkedHashSet<String> linkedSet = new LinkedHashSet<>(listWithDuplicates);
List<String> distinctList = new ArrayList<>(linkedSet);如果需要保持原顺序,可以使用LinkedHashSet,它会按照插入顺序保留元素。
-
使用TreeSet(排序后去重):
1
2
3List<String> listWithDuplicates = ...;
TreeSet<String> treeSet = new TreeSet<>(listWithDuplicates);
List<String> sortedDistinctList = new ArrayList<>(treeSet);使用TreeSet时,除了去重外,还会根据元素的自然排序或自定义比较器进行排序。
-
Java 8 Stream API(有序去重):
1
2
3List<String> distinctList = listWithDuplicates.stream()
.distinct()
.collect(Collectors.toList());利用Stream API的
distinct()方法进行流式处理去重,最后通过collect()方法收集到新的List中。 -
遍历并判断添加(有序去重):
1
2
3
4
5
6
7List<String> listWithDuplicates = ...;
List<String> distinctList = new ArrayList<>();
for (String item : listWithDuplicates) {
if (!distinctList.contains(item)) {
distinctList.add(item);
}
}这种方法是逐个检查新列表中是否已包含当前元素,如果未包含则添加进去。
-
迭代器去重(无序去重,效率较低,不推荐):
1
2
3
4
5
6
7Iterator<String> iterator = listWithDuplicates.iterator();
while (iterator.hasNext()) {
String current = iterator.next();
while (iterator.hasNext() && current.equals(iterator.next())) {
iterator.remove(); // 移除下一个相同的元素
}
}这种方法使用迭代器删除所有连续出现的重复项,但不保证整体上的顺序且效率较低,一般不建议使用。
每种方法都有其适用场景,根据实际需求选择合适的方法。
对象去重
在Java中,如果List集合中的元素是对象,并且想要根据对象的某个属性去重,可以使用Java 8及更高版本提供的Stream API来实现。以下是一个通用示例:
假设我们有一个用户类User,它有一个名为id的属性:
1 | public class User { |
现在我们有一个包含重复用户的列表,并希望根据id属性去除重复项:
1 | List<User> usersWithDuplicates = ...; // 假设这是包含重复用户对象的列表 |
在上述代码中,若要根据id属性去重,有几种选择:
- 使用自定义包装类并结合TreeSet与Comparator的方式,当自定义Comparator时,确保其按照
id字段进行排序和比较。 - 直接修改
User类,覆盖equals()和hashCode()方法,使得两个User对象如果它们的id相同则认为是相等的。这样,在调用distinct()方法时会自动按照这个逻辑去重。
请注意,第二种方法会改变整个类的相等性判断逻辑,仅当id是决定对象唯一性的关键属性时才适合这样做。
UserByIdWrapper类
1 | public class User { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 From Zero to Hero!