有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    根据我所了解的要求,你有一些名字独特的狗,公司和排名可以改变,应该根据文件上的数据进行更新。假设我们有记录

    Jack|Rocky Dogs|4
    

    以下两个条目将更新地图上的内容

    Jack|Rocky Dogs|6
    Jack|Best Dogs|4
    

    您在代码中看到的是,公司的更改不会更新存储的值,对吗?这是因为您使用Dog实例作为键,当狗名相同时,两个实例被视为相等。这意味着,以下两项相等:

    new Dog("Jack", "Rocky Dogs")
    new Dog("Jack", "Best Dogs")
    

    现在,当地图有一个条目,其中第一条狗是一个键,而现在你为第二条狗添加了一个条目时,地图会保留键(new Dog("Jack", "Rocky Dogs")),但会更新值(新的统计数据)。带来了不必要的影响:繁殖公司没有更新,仍然是“岩石狗”

    如何解决它

    唯一重要的不是Dog实例,而是狗的名字。首先,我要创建一张这样的地图:

    // maps a dog name, which is unique, to dog stats
    private Map<String, DogStats> dogStats = new HashMap<>();
    

    因为我们现在失去了育种公司,我将DogStats类更改为dog字段,而不是dogName

    public class DogStats {
      private Dog dog;
      private int rank;
    
      public DogStats(Dog dog, int rank) {
        this.dog = dog;
        this.rank = rank;
      }
    
      // getters and setters
    }
    

    这样,我们就不需要关心特殊的equalshashcode,因为映射键是String