Java HashMap<;整数,双精度>;插入楠
我试图用一个整数保存一些双精度值,作为HashMap的索引。 我的问题是,我在映射中有一些NaN值,这很奇怪,因为正如你在下面的代码中看到的,如果它是NaN,我将打印出一个错误。 println函数从未被调用,即使我在映射中得到了一些NaN值。 函数compareDocs返回为DoubleJava 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<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)
。