如何放置上述类型的地图。我不想覆盖现有的映射。
到目前为止,我的代码是:
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);
}
}
}
我在这里停留是因为我收到一条错误消息,内容为“将项目类型从字符串更改为列出字符串”。我无法弄清楚我做错了什么。
答案 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);