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
相关产品推荐
相关产品推荐

