java集合List快速实现重复判断的方法小结
作者:荧光石
在java编写代码中经常会遇到某些重复判定或者去重的操作,包括:
- 数据清洗:从数据库或其他来源获取的数据可能包含重复项,需要去重。
- 用户输入:前段传入的数据可能存在重复,需要校验去除重来避免处理时出现错误或不一致。
- 列表合并:将多个列表合并后,可能会产生重复元素,去重也是合并后常见的操作。
以下是用来记录会用到的去重操作,以防忘记:
1、使用流式 API
使用流式 API,通过流式 API 优雅地检查重复数据(推荐)
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class CheckDuplicate {
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C", "A");
// 找到重复元素
Set<String> duplicates = list.stream()
.filter(item -> list.stream().filter(item::equals).count() > 1)
.collect(Collectors.toSet());
System.out.println("重复元素: " + duplicates);
System.out.println("是否存在重复数据: " + !duplicates.isEmpty());
}
}
stream 是一种功能非常强大的方式,可以很便利的使用声明式方法对集合进行处理,不需要显式地操作集合中的元素。它提供了一个更加函数式的编程模型,允许你进行过滤、转换、收集等操作,同时链式调用,提高了代码的可读性和简洁性。
相比下forEach 是集合类的一个方法,用于对集合中的每个元素执行一个操作,通常是遍历操作。并不提供流式的转换或过滤功能,更多是为了逐个访问元素并执行某些操作。forEach 的典型用法是遍历集合,但不适合用于流式的处理,在这里 forEach 需要显式地在内部写逻辑来计算元素的出现情况。
2、使用原生 Set 快速检查
使用原生 Set 快速检查,可以直接使用 HashSet 或 LinkedHashSet 来判断
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class CheckDuplicate {
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C", "A");
Set<String> seen = new HashSet<>();
boolean hasDuplicate = list.stream().anyMatch(item -> !seen.add(item));
System.out.println("是否存在重复数据: " + hasDuplicate);
}
}!seen.add(item) 会返回:
true--重复元素,false--非重复元素,第一次添加
anyMatch会匹配所有的流元素,一旦出现符合条件的重复元素就会自动结束流,仅适合判断是否会有重复元素。
3、使用new HashSet<>(list)
使用new HashSet<>(list),最后判断两个list间size大小判断是否重复
import cn.hutool.core.collection.CollUtil;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
public class CheckDuplicate {
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C", "A");
// 使用 Hutool 的工具方法创建 HashSet
Set<String> set = new HashSet<>(list);
boolean hasDuplicate = set.size() != list.size();
System.out.println("是否存在重复数据: " + hasDuplicate);
}
}
比较两个集合size大小就可判断是否存在重复元素,因为Set下的集合是自动去重的,如果存在重复则集合大小会缩减
4、使用CollUtil.countMap()方法
如果有hutool工具,可以使用CollUtil.countMap()方法
import cn.hutool.core.collection.CollUtil;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class CheckDuplicate {
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C", "A", "B");
// 统计每个元素出现的次数
Map<String, Integer> countMap = CollUtil.countMap(list);
// 打印重复元素
countMap.forEach((key, value) -> {
if (value > 1) {
System.out.println("重复元素: " + key + ",出现次数: " + value);
}
});
}
}Collutil.countMap()方法不仅可以统计出现的重复的元素,还可以统计出现的频次,返回结果如下:
重复元素: A,出现次数: 2
重复元素: B,出现次数: 2
相应的还有CollUtil.newHashSet() 去重,CollUtil.getSet()转换Set<>集合去重,以及CollUtil.getCommon()集合交差去重,方法很多有兴趣的伙伴们可以去研究研究。
结语
总得来说java下stream流是非常不错的方式,而且其下有很多filter,iterator,filter(), map(), collect()等操作,便于处理复杂逻辑链路问题
当然,如果仅有一些简单内部处理,直接foreach是最简单高效的方式,避免了流的转换。
到此这篇关于java集合List快速实现重复判断的方法小结的文章就介绍到这了,更多相关java重复判断内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
