【问题标题】:Java adjusting nested Hashmap valueJava调整嵌套的Hashmap值
【发布时间】:2019-01-16 10:24:12
【问题描述】:

我试图使用此处给出的想法来调整嵌套哈希图,但我的解决方案不起作用:How to update a value, given a key in a java hashmap?。我的嵌套哈希图是shoppingLists。它包含购物清单listID 的外部哈希图作为键和项目的哈希图作为值。 items hashmap包含itemName作为键和项目的数量作为值。 adjustItemAmount 尝试将项目的数量调整为给定数量 x

HashMap<String, HashMap<String, Integer>> shoppingLists = new HashMap<>();

public void adjustItemAmount(String itemName, int x, String listID) {
  int current_amount = shoppingLists.get(listID).get(itemName);
  HashMap<String, Integer> items = shoppingLists.get(listID);
  HashMap updatedItems = items.put(itemName, items.get(itemName) + x);
  shoppingLists.put(listID, updatedItems);
}

HashMap updatedItems = items.put(itemName,items.get(itemName)+x); 行指出 Java 需要一个 hashmap 但得到一个整数。我不明白这是怎么回事。

【问题讨论】:

  • 那么,这段代码有什么问题?
  • 编辑问题以表明问题。
  • “声明 Java 需要一个哈希图但得到一个整数”是什么意思?如果您遇到异常,请发布完整的详细信息:异常类型、消息和堆栈跟踪。另外,请创建一个reproducible example。目前,如果不对您的数据做出假设,我们就无法执行您的代码。

标签: java hashmap


【解决方案1】:

HashMap 的 put 方法不返回 HashMap。它返回值。因此这一行是不正确的:

    HashMap updatedItems= items.put(itemName,items.get(itemName)+x);

返回类型将是整数,因为项目映射是 &lt;String, Integer&gt; 类型。

【讨论】:

    【解决方案2】:

    你写

    HashMap updatedItems= items.put(itemName,items.get(itemName)+x);
    

    但是 put 方法返回键的先前值,该值已更新,如果没有值,则返回 null,而不是 HashMap。见https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html#put-K-V-

    换行

    Integer addedValue = items.put(itemName,items.get(itemName)+x);
    

    或者只是

    items.put(itemName,items.get(itemName)+x);
    

    【讨论】:

      【解决方案3】:

      请参阅put 的文档 -

      返回:与键关联的前一个值,如果存在则返回 null 没有键映射。 (返回 null 也可以表示地图 如果实现支持,则以前将 null 与键关联 空值。)

      https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#put(K,%20V)

      所以,这个

      HashMap updatedItems= items.put(itemName,items.get(itemName)+x);

      编译会失败,不能返回HashMap,但会返回Integer

      相反,应该是-

      Integer updatedItems= items.put(itemName,items.get(itemName)+x);

      【讨论】:

        【解决方案4】:

        放入 HashMap 返回 Value 对象,在本例中为 Integer。您正在尝试将此 Integer 分配给 HashMap。删除分配,您的代码将起作用。替换

        public void  adjustItemAmount (String itemName, int x,String listID){
                    int current_amount = shoppingLists.get(listID).get(itemName);
                    HashMap <String,Integer> items = shoppingLists.get(listID);
                    items.put(itemName,items.get(itemName)+x);
                    shoppingLists.put(listID,items);    
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-12
          • 2011-02-16
          相关资源
          最近更新 更多