我创建了一个链接列表,带有插入,搜索和删除功能。我还为它创建了一个迭代器。现在,假设我这样做:
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());
它没有,因为迭代器指向null。以下是搜索功能的实现:
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()工作,没有意识到别的东西是错的。遗憾。答案 0 :(得分:11)
请注意,使用.equals()
比较双打可能会导致错误。 Double.equals()
使用它作为其相等测试:
d1.doubleValue() == d2.doubleValue()
双打和浮动是存储在内存固定空间中的数字的近似值。
为了正确比较浮点数,您需要注意由于浮点数的性质,会出现一些错误。
请参阅:http://www.google.com/search?q=floating+point+equality
比较双打的快捷方法是使用Math.abs(a-b)<ACCEPTABLE_ERROR
其中ACCEPTABLE_ERROR可能是.000000000001
,具体取决于您的具体操作。
(注意这不会处理NaN和INFINITY等边缘情况)
答案 1 :(得分:2)
你不需要!=运算符。它comapres引用。您需要.equals()
方法:
public iterator search(T data)
{
no<T> temp = first;
while (!data.equals(temp.data)) {
temp = temp.next;
}
return (new iterator(temp));
}
另外,请注意auto-boxing。您可能会发现test.search(20.1)
框20.1到Float
而不是Double
,这可能会破坏您的比较。将结果与test.search(20.1d)
进行比较。如果我没记错的话,表达式为:
new Float(20.1).equals(new Double(20.1))
是假的。