如何查找并打印ArrayList中的重复值?现有代码无法正常运行
解决ArrayList重复值检测的问题
首先,你的代码有两个核心问题导致无法正常运行和逻辑错误:
1. 语法错误
你的if语句缺少了必要的括号,Java要求条件必须用()包裹,这是编译层面的错误,修正后这部分代码应该是:
if (list.contains(list.get(i))) { System.out.println(list.get(i)+" is duplicated"); }
2. contains方法的逻辑误区
就算修正了语法,这段代码也会把所有元素都判定为“重复”——因为list.contains(list.get(i))永远返回true,当前遍历的元素本身就在列表里呀!这显然不是你要的“检测重复出现元素”的逻辑。
正确的实现方式
下面给你几种实用的方案,按需选择:
方案一:用Set跟踪已遍历元素(高效推荐)
Set的特性是不允许重复元素,我们可以遍历列表时把元素加入Set,如果加入失败,说明这个元素已经出现过,就是重复值:
ArrayList<String> list = new ArrayList<>(); list.add("Sagio Mane"); list.add("Karius"); list.add("Mo Salah"); list.add("Firmino"); list.add("Lovren"); list.add("Steven Gerrard"); list.add("Karius"); list.add("Mo Salah"); Set<String> seen = new HashSet<>(); for (String name : list) { if (!seen.add(name)) { System.out.println(name + " is duplicated"); } }
这个方法时间复杂度是O(n),效率很高,元素每重复一次就会打印一次(比如Karius出现两次会打印一次,出现三次会打印两次)。
方案二:双重循环对比(适合理解基础逻辑)
如果想手动实现重复检测逻辑,可以用两层循环:外层遍历每个元素,内层遍历它之后的元素,找到重复项就打印:
for (int i = 0; i < list.size(); i++) { String current = list.get(i); for (int j = i + 1; j < list.size(); j++) { if (current.equals(list.get(j))) { System.out.println(current + " is duplicated"); break; // 找到一次重复就跳出内层循环,避免重复打印同一元素 } } }
这个方法时间复杂度是O(n²),数据量大时效率较低,但适合理解重复检测的基础逻辑。
方案三:Java 8+ Stream API(简洁写法)
如果使用Java 8及以上版本,可以用Stream统计元素出现次数,筛选出次数大于1的元素:
list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet() .stream() .filter(entry -> entry.getValue() > 1) .forEach(entry -> System.out.println(entry.getKey() + " is duplicated"));
这个写法更简洁,会把所有重复元素(无论重复多少次)只打印一次。
内容的提问来源于stack exchange,提问作者Valek
相关产品推荐
相关产品推荐

