Java调整嵌套的Hashmap值

时间:2018-08-09 04:19:58

标签: java hashmap

我试图使用此处给出的想法来调整嵌套的哈希图,但我的解决方案不起作用:How to update a value, given a key in a java hashmap?。我的嵌套哈希图是shoppingLists。它包含购物清单listID的外部哈希图作为键,以及商品的哈希图作为值。项目哈希图包含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需要一个哈希图,但得到一个整数。我不知道是怎么回事。

4 个答案:

答案 0 :(得分:3)

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

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

返回类型为Integer,因为项目映射为<String, Integer>类型。

答案 1 :(得分: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);

答案 2 :(得分:2)

请参阅put-的文档

  

Returns:与key关联的先前值;如果有,则返回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);

答案 3 :(得分:1)

HashMap中的

put返回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);    
        }