方法 put() 在 java 映射类型为 <<String>,列表<String>>



我如何放入上述类型的地图中。我不想覆盖现有的映射。

到目前为止,我的代码是:

public class Store {
  Map<String, List<String>> items;
  public Store(){
     items = new HashMap<String, List<String>>();
  } 
  public boolean containsKey(String key) {
     return items.containsKey(key);
  }
   public void put(String key, String item) {
      List<String> myList = new ArrayList<>();
      if (myList == null) {
        myList = new ArrayList<String>();
        items.put(key, item);
      }
  }
}   

我在这里停了下来,因为我收到了一条错误消息,说"将项目类型更改为字符串列表字符串"。我不知道我做错了什么。

在这里,双重错误:

 List<String> myList = new ArrayList<>();
 if (myList == null) {
   myList = new ArrayList<String>();
   items.put(key, item);
 }

myList永远不会为null,您只是为其分配了一个列表!item只是一个字符串,因此您不应将其用作值列表字符串列表的地图的值!

你去:

  List<String> myList = items.get(key);
  if (myList == null) {
    myList = new ArrayList<String>();
  }
  myList.add(item);
  items.put(key, myList);

而不是。

含义:首先,您检查是否已经有该键的列表。如果没有,您会创建一个空的。然后,您将新项目添加到(可能是新的)列表中。在最终将列表放入地图之前(它可能已经存在,但是您只需用"本身"覆盖该信息)。

,如果您想知道"专业人士"如何解决这个问题,请查看此问题以及我在问时收到的答案。

或使用为此要求而设计的Map.computeIfAbsent():如果不是特定键的现有映射,请添加新条目并获取(新的或现有)的值:

items.computeIfAbsent(key, k -> new ArrayList<>())
     .add(item);

最新更新