gpt4 book ai didi

Java HashMap put() 奇怪的行为

转载 作者:行者123 更新时间:2023-12-01 18:44:35 25 4
gpt4 key购买 nike

我创建了一个包含十个字段的 HashMap:key 类型为 Stringvalue 类型为一个double[]

当我尝试使用 put(String id, double[] newVal) 更新 map 时,不仅会更新与“id”键关联的值,还会更新 map 中的所有值。

如何解决这个问题?

      for (int j = 0;j<attrIndex.length;j ++){

String name = train.attribute(attrIndex [j]).name();
double g = eval.evaluateAttribute(attrIndex[j]);

double[] newVal = {0.0, 0.0};
double w = 1;
if (g == 0.0)
w = 0.5;

newVal = table.get(name);
newVal[0] += g;
newVal[1] += w;
table.put(name, newVal);

}

最佳答案

我非常确定真正的错误并不在您向我们展示的代码中。考虑一下:

    double[] newVal = {0.0, 0.0};
// ...
newVal = table.get(name); // LOOK HERE
newVal[0] += g;
newVal[1] += w;
table.put(name, newVal);

乍一看,您似乎正在创建一个新的double[],然后更新它。但事实上,正在更新的 double[] 是您从哈希表中提取的。 (您正在初始化的 double[] 被丢弃,并且代码中的 put 操作是多余的。)

那么这怎么会成为一个问题呢?嗯,本身并非如此。但这确实意味着其他东西必须用一组初始条目填充。症状表明填充表的代码如下所示:

   double[] val = {0.0, 0.0};
for (String name : ...) {
table.put(name, val);
}

...正在创建多个共享相同double[]的哈希表条目。因此,很自然地,当您更新与一个名称关联的值时,您实际上是在更新与所有名称关联的值。

<小时/>

JB Nizet(现已删除)的代码解决了该问题的原因是,它每次更新条目时都会替换 double[] 对象。

但解决此问题的更好方法是将初始化代码更改为:

   for (String name : ...) {
double[] val = {0.0, 0.0};
table.put(name, val);
}

您可以将更新代码简化为:

for (int j = 0;j<attrIndex.length;j ++){
String name = train.attribute(attrIndex [j]).name();
double g = eval.evaluateAttribute(attrIndex[j]);
double w = 1;
if (g == 0.0)
w = 0.5;
double[] val = table.get(name);
val[0] += g;
val[1] += w;
}

关于Java HashMap put() 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18353537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com