类型为<< string>,List <string >>

时间:2019-03-02 19:38:48

标签: java

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

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

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);
      }
  }

}   

我在这里停留是因为我收到一条错误消息,内容为“将项目类型从字符串更改为列出字符串”。我无法弄清楚我做错了什么。

2 个答案:

答案 0 :(得分:4)

这里,双重错误:

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

myList永远不会为空,您只是为其分配了一个列表!而且item只是一个字符串,因此对于将字符串列表作为值的映射,您不应将其用作值!

你去:

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

相反。

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

如果您想知道“专家”是如何解决此问题的,请查看此questions以及在询问时得到的答案。

答案 1 :(得分:1)

或使用为此目的而设计的Map.computeIfAbsent():如果不存在特定键的映射,则添加一个新条目,并获取(新的或现有的)值:

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