如何合并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
相关产品推荐
相关产品推荐

