Java调整嵌套的Hashmap值

Java adjusting nested Hashmap value

我试图使用这里给出的想法来调整嵌套的hashmap,但我的解决方案不起作用:如果在java hashmap中给出一个键,如何更新值? 我的嵌套hashmap是shoppingLists。 它包含购物清单listID的外部哈希映射作为键,以及项目的哈希映射作为值。 items hashmap包含itemName作为键,项目的数量作为值。 adjustItemAmount尝试按给定量x调整项目的数量。

1
2
3
4
5
6
7
8
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但是得到一个整数。 我不知道是怎么回事。


HashMap的put方法不返回HashMap。它返回值。因此这条线不正确:

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

返回类型为Integer,因为items map是类型。


请参阅put的文档 -

Returns : the previous value associated with key, or null if there was
no mapping for key. (A null return can also indicate that the map
previously associated null with key, if the implementation supports
null values.)

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


你写

1
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-

将行更改为

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

要不就

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

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

1
2
3
4
5
6
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);    
        }