Java—如何向哈希映射中的现有键添加新值。1个键,多个值

Java—如何向哈希映射中的现有键添加新值。1个键,多个值,java,methods,maps,Java,Methods,Maps,我试图创建一个方法,当给定一个键和一个值时,可以通过该键访问映射,然后添加或替换该特定值。 我的哈希映射是这样创建的: public Band(){ musicians = new HashMap<>(); } 我的新方法头如下所示: public void addValue(){ } 我已经尝试过使用put方法,但是我不能让它像我所希望的那样工作。 我也尝试过遍历映射,但我只使用该方法返回列表中的映射对象,而我不想在该方法中返回任何内容。我希望能够向它发送两个参数(键和

我试图创建一个方法,当给定一个键和一个值时,可以通过该键访问映射,然后添加或替换该特定值。 我的哈希映射是这样创建的:

public Band(){
    musicians = new HashMap<>();
}
我的新方法头如下所示:

public void addValue(){ }
我已经尝试过使用put方法,但是我不能让它像我所希望的那样工作。 我也尝试过遍历映射,但我只使用该方法返回列表中的映射对象,而我不想在该方法中返回任何内容。我希望能够向它发送两个参数(键和值),并让它仅替换该特定值


我希望我的解释已经很清楚了。

Java映射是每个键的单个值

如果一个键需要多个值,则应将该类型设置为适当类型的集合,并添加自己的逻辑以添加新值。您的
Band
类应该具有添加/删除
音乐家的方法,并在私有实现中处理细节

public class Band {

   private Map<String, List<Musician>> members = new HashMap<String, List<Musician>>();

   public void addMusician(String key, Musician musician) {
       if (this.members.containsKey(key) {
           List<Musician> musicians = this.members.get(key);
           if (musician != null) {
               musicians.add(musician);
               this.members.put(key, musicians);
           }
       }
   }

   public void removeMusician(String key, Musician musician) {
       // should be clear enough from the add method.
   }
}
公共类频带{
私有映射成员=新HashMap();
公共音乐人(弦键、音乐家){
if(this.members.containsKey(key){
List muchers=this.members.get(key);
如果(音乐家!=null){
音乐家。添加(音乐家);
这个。成员。放(键,音乐家);
}
}
}
公共无效移除音乐家(字符串键、音乐家){
//从add方法应该足够清楚。
}
}

Java映射是每个键的单个值

如果一个键需要多个值,则应将该类型设置为适当类型的集合,并添加自己的逻辑以添加新值。您的
Band
类应具有添加/删除
音乐家的方法,并在私有实现中处理细节

public class Band {

   private Map<String, List<Musician>> members = new HashMap<String, List<Musician>>();

   public void addMusician(String key, Musician musician) {
       if (this.members.containsKey(key) {
           List<Musician> musicians = this.members.get(key);
           if (musician != null) {
               musicians.add(musician);
               this.members.put(key, musicians);
           }
       }
   }

   public void removeMusician(String key, Musician musician) {
       // should be clear enough from the add method.
   }
}
公共类频带{
私有映射成员=新HashMap();
公共音乐人(弦键、音乐家){
if(this.members.containsKey(key){
List muchers=this.members.get(key);
如果(音乐家!=null){
音乐家。添加(音乐家);
这个。成员。放(键,音乐家);
}
}
}
公共无效移除音乐家(字符串键、音乐家){
//从add方法应该足够清楚。
}
}

我认为最适合您的方法是使用番石榴多重地图

 ListMultimap<String, String> musicianMap = ArrayListMultimap.create();
你们可以用钥匙把它们都拔出来

musicianMap.get("Beatles")

这将返回
[“John Lenon”、“Paul McCartney”、“Ringo Starr”]
当然,这些将是类音乐家的对象。

我认为最适合您的是使用Guava Multimap

 ListMultimap<String, String> musicianMap = ArrayListMultimap.create();
你们可以用钥匙把它们都拔出来

musicianMap.get("Beatles")


这将返回
[“John Lenon”、“Paul McCartney”、“Ringo Starr”]的列表
当然,这些将是Musitor类的对象。

您需要另一个集合,可能是一个列表作为hashmapI的值。我觉得它不太清楚。您尝试了什么?以及您不喜欢它的哪些方面。您没有显示
Musitors
的声明没有帮助……“我无法让它按我想要的方式工作”-那么你想要什么,它做了什么,你还尝试了什么?你需要另一个集合,可能是一个列表作为hashmapI的值。我觉得不太清楚。你尝试了什么?以及你不喜欢它的哪些方面。你没有显示
音乐家
的声明是没有帮助的…“我无法获得它[to]“我想干什么就干什么”-那么你想要什么,它做了什么,你还尝试了什么?这当然是正确的,除了约翰·列侬的姓拼写错误和乔治·哈里森被排除在外。番石榴是一个很好的图书馆,但它需要额外的依赖性。没有它,可以很容易地解决这个问题。更正na根据@duffymo的建议,我推荐了披头士乐队成员,我同意番石榴将是一种额外的依赖性,但我认为它的方法节省了大量的锅炉代码工作。不是很多-两种方法,如我所示。谢谢你的更正。我决不想把这作为对你答案的批评。依赖性的选择是我们都必须做出的。是的h、 但是您跳过了将元素放入列表时需要编写的逻辑和代码,首先我们必须检查列表是否已经存在,如果没有创建列表,然后插入其中。同样的,当从映射中拉出此项时,我们总是担心那些NullPointerException。好的,我同意从您的角度来看,这些可能是小事情,或者即使是我的,但看看问题……这家伙对地图了解不多,为了使用地图,你的代码会先教他列出:D:D这当然是正确的,除了约翰·列侬的姓拼写错误和乔治·哈里森被排除在外。番石榴是一个很好的图书馆,但它需要额外的依赖性。它是pos如果没有它,很容易解决这个问题。按照@duffymo的建议更正了披头士乐队成员的名字,我同意番石榴将是一个额外的依赖项,但我认为它的方法节省了大量的锅炉代码工作。正如我所示,不是很多-两种方法。谢谢你的更正。我决不想把这当作对你的answe的批评r、 依赖项的选择是我们所有人都必须做出的。是的,但是你跳过了你需要编写的逻辑和代码,把一个元素放到列表中,首先我们必须检查是否有一个列表已经存在,如果没有创建一个,然后插入其中。同样的,当把这个从映射中拉出来的时候,我们总是害怕那些NullPointerException。好的,我是gree从你甚至我的角度来看,这些可能都是小事,但看看问题……这家伙对Map不太了解,你的代码会先教他列出,以便使用Map:D:D这很好,对我来说确实很有意义。我试图通过将一些数据传递到参数中来测试它,但我不确定h