给定人与狗的地图:
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;
});
}