hashmap如何在Java中基于一个关键字段合并映射?
如何基于CustomClass键内部字段之一合并两个HashMaps<CustomClass key, AnotherCustomClass value>
?例如,我有一个类Dog,它带有String name和String breedingCompany字段(作为Hashmap中的键),还有DogStats,它带有rankingPlace字段(作为值),我必须从文本文件中导入一些Dogs | DogStats。在这种情况下,狗的名称和繁殖公司的名称是唯一的,对于狗,只能从文件中更改繁殖公司
在程序内部,我有现有的HashMap:
“迈克”,“玫瑰糖”,5
《杰克》、《摇滚巨魔》6
《安妮》、《LOLDogs》7
我想从文本文件中更新它(如果有的话,还想添加一些新记录):
“Mike”,“RosesDogs”,4(值更改)
“杰克”,“最佳狗狗”,6(重点领域之一:“育种公司”已更改)
“安妮”,“LOLDogs”,7(和以前一样)
《约翰》、《新狗公司》1(新纪录)
如果当前地图中不存在,如何更新地图并添加put new
我知道我必须在Dog类中实现equal和hashcode(仅用于名称),但元素的比较仍然不起作用。我不知道该怎么做
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))){
while ((nextLine = bufferedReader.readLine()) != null) {
String[] dogsLine = nextLine.split("\\|");
dogName = dogsLine[0];
dogBreedingCompany = dogsLine[1];
dogRankingPlace = Integer.parseInt(dogsLine[2]);
Dog dog = new Dog(dogName, dogBreedingCompany);
DogStats dogStats = new DogStats(dogName, dogRankingPlace);
dogMap.put(dog, dogStats);
counter++;
}
然后是现有地图existingDogMap.putAll(InputManager.importDogsFromFile(filename));
狗。阶级
import java.util.Objects;
public class Dog {
private String name;
private String breedingCompany;
public Dog(String name, String breedingCompany) {
this.name = name;
this.breedingCompany = breedingCompany;
}
@Override
public String toString() {
return name + "|" + breedingCompany;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Dog dog = (Dog) o;
return name.equals(dog.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
public String getName() {
return name;
}
public String getBreedingCompany() {
return breedingCompany;
}
}
# 1 楼答案
根据我所了解的要求,你有一些名字独特的狗,公司和排名可以改变,应该根据文件上的数据进行更新。假设我们有记录
以下两个条目将更新地图上的内容
您在代码中看到的是,公司的更改不会更新存储的值,对吗?这是因为您使用
Dog
实例作为键,当狗名相同时,两个实例被视为相等。这意味着,以下两项相等:现在,当地图有一个条目,其中第一条狗是一个键,而现在你为第二条狗添加了一个条目时,地图会保留键(
new Dog("Jack", "Rocky Dogs")
),但会更新值(新的统计数据)。带来了不必要的影响:繁殖公司没有更新,仍然是“岩石狗”如何解决它
唯一重要的不是
Dog
实例,而是狗的名字。首先,我要创建一张这样的地图:因为我们现在失去了育种公司,我将
DogStats
类更改为dog
字段,而不是dogName
这样,我们就不需要关心特殊的
equals
和hashcode
,因为映射键是String