You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找并打印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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:04:23