我在使用 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/