【问题标题】:Java HashMap<Integer, Double> inserts NaNJava HashMap<Integer, Double> 插入 NaN
【发布时间】:2015-04-30 02:52:13
【问题描述】:

我正在尝试将一些带有整数的 Double 值保存为 HashMap 的索引。 我的问题是我在 Map 中有一些 NaN 值,这很奇怪,因为正如您在下面的代码中看到的那样,如果它是 NaN,我会打印出一个错误。 println 函数永远不会被调用,即使我的 Map 中有一些 NaN 值。 函数 compareDocs 以 Double 形式返回。

    HashMap<Integer, Double> distVec = new HashMap<Integer, Double>();
    int i = 0;
    for (IGSDocument doc : train) {
        Double dist = compareDocs(test, doc);
        if(dist == Double.NaN){
            System.err.println("Not a Number");
        }
        distVec.put(i, dist);
        i++;
    }
    System.out.println(distVec);

有人知道是我的错吗?

【问题讨论】:

  • NaN 不等于 NaN

标签: java hashmap double nan


【解决方案1】:

NaN 不等于它自己(它不等于anything),所以dist == Double.NaN 总是假的。使用

if(!dist.isNaN()) {
  distVec.put(i, dist);
  ++i;
}

if(!Double.isNaN(dist)) {
  distVec.put(i, dist);
  ++i;
}

后者也适用于double dist

旁注:由于NaN是唯一不等于自身的数字,

if(dist == dist) {
  ...
}

也适用于double dist(但不那么漂亮)。我不建议您使用它(无论如何,它不适用于对象类型Double),但它说明了工作机制。

【讨论】:

  • 我想你的意思是!Double.isNaN(dist)
【解决方案2】:

试试 Double wrapper 类的 isNan 方法,如:

dist.isNan()

而不是与“==”比较,因为 NaN 不等于自身。还有另一件事,你的 if 语句:

if(dist == Double.NaN){
     System.err.println("Not a Number");
}

即使使用新方法,你也会抓到 Nan,但这不会再次阻止你进入 hashMap。因此,您应该将 if 更改为:

if(dist.isNaN()){
    System.err.println("Not a Number");
    continue;//continue with other values and ignore NaN
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2015-06-18
    • 2020-11-30
    • 2012-05-26
    相关资源
    最近更新 更多