Java HashMap 遍历每个循环,但所有值都相同,是循环的最后一个值

标签 java java-8 hashmap

我在使用 Java HashMap API 时遇到问题。我遍历循环,然后将键和值插入到 HashMap。我还在插入到 hashmap 之前检查所有值是否正确存在。然后我打印 HashMap ,最后打印了相同的值。但都是上面循环的最后一个值。下面是代码:-

    Map<String,Map<String,StockReOrderLevel>> stockReorderLevels = new HashMap<>();
    List<StockReOrderLevel> defaultStockItemList = db.findDefaultStockItem();
    List<String> orderedItemCodes=new ArrayList<>();
    Map<String, StockReOrderLevel> itemMap = new HashMap<>();

    defaultStockItemList.forEach(item-> {
        orderedItemCodes.add(item.getCode());
        itemMap.put(item.getCode(), item);
    });

    outletList.forEach(outletCode->{

        Map<String, StockReOrderLevel> clone = (Map<String, StockReOrderLevel>) ((HashMap<String, StockReOrderLevel>) itemMap).clone();
        List<OutletItem> lastStockTakenForOutlet = db.findLastStockTakenForOutlet(outletCode);

        if(lastStockTakenForOutlet!=null && !lastStockTakenForOutlet.isEmpty()){
            lastStockTakenForOutlet.forEach(outletItem -> {

                if (clone.containsKey(outletItem.getItemCode())) {
                    StockReOrderLevel stockReOrderLevel = clone.get(outletItem.getItemCode());
                    stockReOrderLevel.setReorderlevel(outletItem.getReorderLevel());
                    clone.put(outletItem.getItemCode(),stockReOrderLevel);
                }
            });

            //get database values
            Map<String,Object> paramMap=new HashMap<>();
            paramMap.put("outletCode",outletCode);
            paramMap.put("takenDate",lastStockTakenForOutlet.get(0).getTakenDate());
            List<ItemLevel> reOrderedLevelOutletItems=db.findTotalOrderdBottlesByOutlet(paramMap);

            //change the clone again
            if(reOrderedLevelOutletItems!=null && !reOrderedLevelOutletItems.isEmpty()){
                reOrderedLevelOutletItems.forEach(itemLevel -> {

                    if (clone.containsKey(itemLevel.getItemCode())) {

                        StockReOrderLevel stockReOrderLevel = clone.get(itemLevel.getItemCode());
                        stockReOrderLevel.setReorderlevel(stockReOrderLevel.getReorderlevel()+itemLevel.getAmount());

                        clone.put(itemLevel.getItemCode(),stockReOrderLevel);
                    }
                });
            }
        }

        //convert map and it gives the map correctly
        Map<String,StockReOrderLevel> idlOrdered= getIndexedItemOrder(orderedItemCodes,clone);

        //i printed values before add to parent map in here
        stockReorderLevels.put(outletCode, idlOrdered);
    });
    return stockReorderLevels;

最佳答案

当您在 for 循环后打印时重复最后一个元素时,几乎可以肯定是由于没有声明新变量(因此没有声明新内存)。例如:

    List <Integer[]> arrayOuter = new ArrayList <> ();
    Integer[] array = new Integer[] {1, 2, 3, 4};

    for (int i = 0; i < 4; i++) {
        //shuffle array    
        Collections.shuffle(Arrays.asList(array));

        //add array to arraylist
        arrayOuter.add(array);
    }

如果 shuffle 的最后结果是 {4, 2, 1, 3},它会打印 {4, 2, 1, 3} 4 次,因为我声明数组被插入一次,因此所有元素都指向一个数组(并且每次迭代都会覆盖前一次迭代)。正确的方法是在循环的每次迭代中声明一个新数组,如下所示:

    List <Integer[]> arrayOuter = new ArrayList <> ();


    for (int i = 0; i < 4; i++) {
        Integer[] array = new Integer[] {1, 2, 3, 4};
        //shuffle array    
        Collections.shuffle(Arrays.asList(array));

        //add array to arraylist
        arrayOuter.add(array);
    }

我能想到的另一个罪魁祸首是您的 key outletCode 保持不变,并且您在循环的每次迭代中都覆盖了之前的 (key, value)。

关于Java HashMap 遍历每个循环,但所有值都相同,是循环的最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53348147/

相关文章:

java - 在字符串 Arraylist 中查找和打印重复项

hashmap - Rust基准测试优化

java - JSF : how to force creating a new managed bean instance for every browse instance

java - 标准权利模型

java - Maven 故障保护 : verify always returns exit code 0

java - 如何使用流查找对象数组中的元素

java - 终端操作(例如 forEach)是否可以重新抛出已检查的异常?

java - 如何从字符串输入实现 HashMap

Java - 从 jar 中删除 META-INF 不起作用

java - 使用一对一关系 hibernate 进行更新