Java HashMap<;整数,双精度>;插入楠

Java HashMap<;整数,双精度>;插入楠,java,hashmap,double,nan,Java,Hashmap,Double,Nan,我试图用一个整数保存一些双精度值,作为HashMap的索引。 我的问题是,我在映射中有一些NaN值,这很奇怪,因为正如你在下面的代码中看到的,如果它是NaN,我将打印出一个错误。 println函数从未被调用,即使我在映射中得到了一些NaN值。 函数compareDocs返回为Double HashMap<Integer, Double> distVec = new HashMap<Integer, Double>(); int i = 0; fo

我试图用一个整数保存一些双精度值,作为HashMap的索引。 我的问题是,我在映射中有一些NaN值,这很奇怪,因为正如你在下面的代码中看到的,如果它是NaN,我将打印出一个错误。 println函数从未被调用,即使我在映射中得到了一些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);
HashMap distVec=newhashmap();
int i=0;
用于(IGS文件文件:列车){
双区=比较区(测试,文档);
if(dist==Double.NaN){
System.err.println(“非数字”);
}
distVec.put(i,dist);
i++;
}
系统输出打印项次(distVec);

有人知道是我的错吗?

NaN
不等于它本身(它不等于任何东西),所以
dist==Double.NaN
总是错误的。使用

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

后者也适用于双距离

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

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

也适用于双距离(但不太美观)。我不建议您使用它(无论如何,它不适用于对象类型
Double
),但它说明了工作机制。
NaN
不等于它本身(它不等于任何东西),因此
dist==Double.NaN
总是错误的。使用

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

后者也适用于双距离

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

if(dist == dist) {
  ...
}
也适用于双距离(但不太美观)。我不建议您使用它(无论如何,它不适用于对象类型
Double
),但它说明了工作中的机制。

尝试Double wrapper类的方法,如:

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
}
请尝试双包装器类的方法,如:

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
}

NaN不等于NaNNaN不等于NaNNaN我想你的意思是
!双重身份。伊斯南(地区)
。我想你的意思是
!Double.isNaN(dist)