java - HashMap 中每个键的值相同

标签 java list scope hashmap

我将从我的代码开始

 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]

期望的输出是在每个列表中都有随机值。 我猜,范围有问题,我不明白

最佳答案

您正在将同一个 List 实例多次添加到 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 实例的副本。否则,所有列表都将是不同的实例,但仍将包含相同的 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);
}

关于java - HashMap 中每个键的值相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31112396/

相关文章:

列表中 anchor 上的 CSS 背景,由于图像元素符号而无法拉伸(stretch)以覆盖整个 li

c++ - C++ 中的变量作用域

haskell - 部分应用程序和子表达式仅取决于函数参数的一个子集

java - 如何在 Ubuntu 上将 Java 作为服务运行?

java - 无法反序列化来自具有蛇形属性的 kafka 主题的 json 字符串

java - 使用 Maven 将版本文件放入 EAR 或 WAR

java - 维护顺序的列表实现

python - 如何在Python中消除范围内没有不同打乱组合的数字

java - JIRA Rest API - 创建问题 - 错误的请求响应

JavaScript 循环变量作用域