如何合并来自地图<对象、对象>的重复值,并创建地图<对象、列表<Object>>



给定人与狗的地图:

LinkedHashMap<Person, Dog> personDogMap = new LinkedHashMap<>();

人和狗的分类:

class Person {
String name;
String id;
int age; 
//getters
}
class Dog {
String name;
int age;
//getters
}

如何获取Map<Person,>从这个personDogMap中提取重复的值

场景:

personDogMap.put(new Person("John", "12345", 23), new Dog("Luke", 5));
personDogMap.put(new Person("John", "12345", 23), new Dog("Lisa", 7));
personDogMap.put(new Person("John", "54323", 33), new Dog("Frank", 2));
personDogMap.put(new Person("Louis", "95223", 23), new Dog("Nick", 12));

在这种情况下,输出将是:

{
Person(name=John,
id=12345,
age=23)=[
Dog(name=Luke,
age=5),
Dog(name=Lisa,
age=7)
],
Person(name=John,
id=54323,
age=33)=[
Dog(name=Frank,
age=2)
],
Person(name=Louis,
id=95223,
age=23)=[
Dog(name=Nick,
age=12)
]

}

我的第一个尝试是:1 -检查是否有重复的值在键集(id参数,它的区别)2 -如果是,取此副本并将复制键中的所有值添加到List

但是我正在努力减少重复的值。什么好主意吗?

您可以稍后将您的地图转换为Map<Person, Set<Dog>>:

private Map<Person, Set<Dog>> transform(Map<Person, Dog> map) {
return map.entrySet().stream()
.collect(Collectors.groupingBy(Entry::getKey,
Collectors.mapping(Entry::getValue, Collectors.toSet())));
}

或者你用Map<Person, Set<Dog>>结构开始:

private void initMap() {
Map<Person, Set<Dog>> personDogs = new LinkedHashMap<>();
addDog(personDogs, new Person("John", "12345", 23), new Dog("Luke", 5));
addDog(personDogs, new Person("John", "12345", 23), new Dog("Lisa", 7));
addDog(personDogs, new Person("John", "54323", 33), new Dog("Frank", 2));
addDog(personDogs, new Person("Louis", "95223", 23), new Dog("Nick", 12));
}
private void addDog(Map<Person, Set<Dog>> personDogs, Person person, Dog dog) {
personDogs.merge(person,
Set.of(dog),
(dogs, dogs2) -> {
dogs.add(dog);
return dogs;
});
}

最新更新