【问题标题】:Method put() in java Map of type <<String>,List<String>><<String>,List<String>> 类型的 java Map 中的方法 put()
【发布时间】:2023-04-10 22:32:01
【问题描述】:

我怎样才能放入上述类型的地图。我不想覆盖现有的映射。

到目前为止我的代码是:

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

}   

我在这里停下来,因为我收到一条错误消息,指出“将项目类型更改为从字符串中列出字符串”。我不知道我是否做错了什么。

【问题讨论】:

  • items.put(key, item);更改为items.put(key, myList);

标签: java


【解决方案1】:

这里,双重错误:

 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 以及我在询问时收到的答案。

【讨论】:

  • 如何检查密钥是否已经存在并避免覆盖其值?if (ingredients.containsKey(key)) { System.out.println(key + "THIS KEY ALREADY EXIST"); } 这行得通吗?
  • @randomguy 我不明白。 put 实现的全部意义在于,如果 KEY 已知,它将总是添加新字符串。换句话说:如果您希望您的公共合同有所不同(例如:不允许更新已存储的条目),那么您应该重命名您的方法,并说调用它putIfAbsent() 并在密钥已知的情况下抛出异常.换句话说:第 1 步是 100% 明确您打算用代码解决的确切要求。而且那是只有你能做的事情,我不知道你要解决什么问题。
  • 我也很困惑:(。我被要求这样做。" 编写一个方法 void put(String key, String item) 来创建从键到成分的新映射(注意它应该不要覆盖现有的映射,而是添加到它们);“
  • @GhostCat 是你的首领 ;-)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 2020-01-26
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多