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

如何合并LinkedHashMap<Person,Dog>重复键并生成Map<Person,List<Dog>>

解决思路与实现代码

核心问题根源

你之前无法合并的关键原因是Person类没有重写equals()和hashCode()方法。Java默认的对象相等判断基于内存地址,即使两个Person对象的id完全相同,它们也会被视为不同的键,导致无法合并对应Dog值。

第一步:重写Person类的equals和hashCode

必须以id作为唯一判断依据,重写这两个方法,确保相同id的Person对象被视为同一个键:

class Person {
    String name;
    String id;
    int age; 

    // getters

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return id.equals(person.id); // 仅以id判断对象相等
    }

    @Override
    public int hashCode() {
        return id.hashCode(); // 仅用id生成哈希值
    }
}

第二步:合并Dog值到List

有两种高效的实现方式:

方式一:手动遍历处理(兼容Java 8之前版本)

Map<Person, List<Dog>> resultMap = new LinkedHashMap<>();

for (Map.Entry<Person, Dog> entry : personDogMap.entrySet()) {
    Person key = entry.getKey();
    Dog value = entry.getValue();
    
    // 键不存在则新建空List,直接添加当前Dog
    resultMap.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}

方式二:Java 8+ Stream API(更简洁)

如果需要保留原LinkedHashMap的插入顺序,要指定LinkedHashMap作为结果容器:

import java.util.stream.Collectors;

Map<Person, List<Dog>> resultMap = personDogMap.entrySet()
    .stream()
    .collect(Collectors.groupingBy(
        Map.Entry::getKey,
        LinkedHashMap::new, // 保留原集合的顺序
        Collectors.mapping(Map.Entry::getValue, Collectors.toList())
    ));

最终结果验证

处理后你的场景数据会得到:

  • 键为Person("John", "12345", 23),对应List包含Dog("Luke",5)和Dog("Lisa",7)
  • 键为Person("John", "54323", 33),对应List包含Dog("Frank",2)
  • 键为Person("Louis", "95223", 23),对应List包含Dog("Nick",12)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:40:24