Java HashMap <integer,double =“”>插入NaN </integer,>

时间:2015-02-27 11:41:52

标签: java hashmap double nan

我试图用Integer作为HashMap的索引来保存一些Double值。 我的问题是我在Map中有一些NaN值,这很奇怪,因为正如你在下面的代码中看到的那样,如果它是NaN,我会打印出错误。 即使我的Map中有一些NaN值,也从不调用println函数。 函数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);

有没有人看到我的错?

2 个答案:

答案 0 :(得分:3)

NaN不等于它自己(它不等于任何),所以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),但它说明了工作中的机制。

答案 1 :(得分:1)

试用Double包装类的isNan方法,如:

dist.isNan()

而不是与&#34; ==&#34;因为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
}