我将从我的代码开始
public void simulateSale(List<IceCream> dailyIceCreamStock) {
date = LocalDate.now().minusDays(6);
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd");
for (int i = 0; i < timeInterval; i++) {
for(IceCream iceCream: dailyIceCreamStock){
iceCream.setSoldCount(rand.nextInt(IceCream.AMOUNT + 1));
iceCream.setStockDate(date);
}
//Every day should have different ArrayList of values
this.weeklyStats.put(date.toString(fmt), dailyIceCreamStock);
date = date.plusDays(1);
}问题在这条线上:this.weeklyStats.put(date.toString(fmt), dailyIceCreamStock);
如您所见,我将随机生成的值添加到类型为hashmap中:
Map<String, List<IceCream>> weeklyStats问题是,当我迭代这个hashmap时,每个键都有相同的值列表。输出如下:
[11, 3, 11, 12, 20]
[11, 3, 11, 12, 20]
[11, 3, 11, 12, 20]
[11, 3, 11, 12, 20]
[11, 3, 11, 12, 20]
[11, 3, 11, 12, 20]
[11, 3, 11, 12, 20]期望的输出是在每个列表中都有随机值。我想,范围有问题,我不明白
发布于 2015-06-29 09:41:50
您要多次向Map添加相同的列表实例。您应该创建列表的副本,以便在Map中具有不同的值:
for (int i = 0; i < timeInterval; i++) {
List<IceCream> copy = new ArrayList<>(dailyIceCreamStock); // create a copy
for(IceCream iceCream: copy){ // modify the elements of the copy
iceCream.setSoldCount(rand.nextInt(IceCream.AMOUNT + 1));
iceCream.setStockDate(date);
}
//Every day should have different ArrayList of values
this.weeklyStats.put(date.toString(fmt), copy); // put the copy in the Map
date = date.plusDays(1);
}编辑:
实际上,这还不够,您也应该创建IceCream实例的副本。否则,所有列表都将是不同的实例,但be仍然包含相同的IceCream对象。
for (int i = 0; i < timeInterval; i++) {
List<IceCream> copy = new ArrayList<>();
for(IceCream iceCream: dailyIceCreamStock){
IceCream newIC = new IceCream(); // not sure if you want to copy any
// data from the original IceCream
newIC.setSoldCount(rand.nextInt(IceCream.AMOUNT + 1));
newIC.setStockDate(date);
copy.add(newIC); // add a new IceCream instance to the new List
}
//Every day should have different ArrayList of values
this.weeklyStats.put(date.toString(fmt), copy);
date = date.plusDays(1);
}发布于 2015-06-29 09:42:54
每次迭代,都修改相同的List<IceCream> dailyIceCreamStock,所以Map中的所有键都指向相同的列表。
您可能希望在每次迭代时初始化和引用List的一个新的深拷贝,并在执行随机突变后将其放在Map中。
https://stackoverflow.com/questions/31112396
复制相似问题