Java调整嵌套的Hashmap值

Posted

技术标签:

【中文标题】Java调整嵌套的Hashmap值【英文标题】:Java adjusting nested Hashmap value 【发布时间】: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。目前,如果不对您的数据做出假设,我们就无法执行您的代码。 【参考方案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);    
        

【讨论】:

以上是关于Java调整嵌套的Hashmap值的主要内容,如果未能解决你的问题,请参考以下文章

重新调整HashMap大小存在什么问题

java 18 - 9 HashMap和ArrayList的嵌套3

从Hashmap的所有值中获取所有嵌套项

java 18 - 7 HashMap和ArrayList的嵌套1

java 18 - 8 HashMap和ArrayList的嵌套2

在 HBase 中存储嵌套的 HashMap