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

Java如何打印对象数组中的所有重复项(含首次出现条目)

问题根因

你当前的逻辑仅做了单次遍历的存在性判断,没有对相同key的条目做全量归集,因此只能识别到第二次及之后出现的重复项,无法关联到同key下第一次出现的条目,自然拿不到完整的重复内容集合。

实现方案

核心逻辑分两步:

  • 先对所有数组元素按key字段分组,把同一个key对应的所有value归集到同一个列表中,存储结构用Map<String, List<String>>即可,map的键为元素的key字段,值为该key对应所有value的集合
  • 遍历分组完成的map,筛选出value列表长度大于1的key,这些就是存在重复的key,对应的value列表就是该重复key关联的所有值,最后按要求格式输出即可
完整代码示例
import java.util.*;
import java.util.stream.Collectors;

// 对应数组结构的实体类
class Item {
    private String key;
    private String value;

    public Item(String key, String value) {
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }
}

public class DuplicateFinder {
    public static void main(String[] args) {
        // 初始化示例数据
        List<Item> items = Arrays.asList(
                new Item("KEY1", "123"),
                new Item("KEY2", "234"),
                new Item("KEY1", "456")
        );

        // 按key分组归集所有value
        Map<String, List<String>> groupedMap = items.stream()
                .collect(Collectors.groupingBy(
                        Item::getKey,
                        Collectors.mapping(Item::getValue, Collectors.toList())
                ));

        // 筛选重复key及对应的值集合
        List<String> duplicateKeys = new ArrayList<>();
        List<String> duplicateValues = new ArrayList<>();
        for (Map.Entry<String, List<String>> entry : groupedMap.entrySet()) {
            if (entry.getValue().size() > 1) {
                duplicateKeys.add(entry.getKey());
                duplicateValues.addAll(entry.getValue());
            }
        }

        // 按要求格式输出
        if (!duplicateKeys.isEmpty()) {
            System.out.printf("duplicate items found, %s with values %s%n",
                    duplicateKeys,
                    duplicateValues.stream().map(v -> "\"" + v + "\"").collect(Collectors.toList())
            );
        }
    }
}
运行输出

执行上述代码后,输出结果完全匹配你的预期:

duplicate items found, [KEY1] with values ["123", "456"]

如果你的项目环境不支持Java Stream,直接用普通for循环实现分组逻辑即可,核心判断逻辑和上述方案完全一致:遍历每个元素时先检查map中是否存在当前key,不存在则新建列表存入map,存在则将当前value追加到对应列表中,后续筛选重复项的逻辑不变。


内容的提问来源于stack exchange,提问作者Srinivas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:24:46