题
我创建一个链表,与插入件,搜索和删除功能。我还创建了一个迭代器了。现在,假设我这样做:
myList<Integer> test = new myList();
test.insert(30);
test.insert(20);
test.insert(10);
myList.iterator it = test.search(20);
if(it.hasNext())
System.out.println(it.next());
和瞧,它的工作原理(它打印元素的值在节点,在这种情况下20)。现在,如果我这样做:
myList<Double> test = new myList();
test.insert(30.1);
test.insert(20.1);
test.insert(10.1);
myList.iterator it = test.search(20.1);
if(it.hasNext())
System.out.println(it.next());
它没有,这是因为迭代器指向空。下面是搜索功能的实现:
public iterator search(T data)
{
no<T> temp = first;
while( (temp != null) && (temp.data != data) )
temp = temp.next;
return (new iterator(temp));
}
下面就是我如何知道有有鬼用的比较:如果我改变这样上面的代码的一部分:
while( (temp != null) && (temp.data != data) )
System.out.println(temp.data + " " + data);
temp = temp.next;
我可以看到它在列表打印号码。它打印,在一个点上,“20.1 20.1”(例如)。那么,如何解决这一问题?该功能似乎是正确的,但它只是好像Java未能正确地比较数字。
编辑:问心无愧,BigDecimal的给了我同样的问题太
。编辑2:equals()方法的工作,不知道别的东西不对劲。遗憾。
解决方案
您不想这样做的!=运算符。它comapres引用。您希望.equals()
方法:
public iterator search(T data)
{
no<T> temp = first;
while (!data.equals(temp.data)) {
temp = temp.next;
}
return (new iterator(temp));
}
此外,注意自动装箱。您可能会发现test.search(20.1)
箱20.1到Float
不是Double
,这可能会破坏你的比较。比较test.search(20.1d)
结果。如果正确地记得表达式:
new Float(20.1).equals(new Double(20.1))
是假的。
其他提示
请注意,使用.equals()
比较的加倍强>可能会导致错误。 Double.equals()
使用此作为其相等测试:
d1.doubleValue() == d2.doubleValue()
<强>双打和<强>浮强>存储在存储器中的固定空间的数字是近似。
为了正确比较的浮点数的,你需要注意的是,由于彩车的性质,会有一些错误。
请参阅: http://www.google.com/search?q =浮动+点+平等
有一个快速简便的方法来比较双打是使用Math.abs(a-b)<ACCEPTABLE_ERROR
其中ACCEPTABLE_ERROR可以根据究竟是什么你做来.000000000001
。
的(注意,这并不处理边缘情形如NaN和INFINITY)强>