1

我创建了一个链接列表,具有插入、搜索和删除功能。我还为它创建了一个迭代器。现在,假设我这样做:

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 没有正确比较数字。

编辑:wth,BigDecimal 也给了我同样的问题。

编辑 2:equals() 有效,没有意识到还有其他问题。对不起。

4

2 回答 2

11

请注意,使用.equals()来比较双打可能会导致错误。Double.equals()使用它作为它的平等测试:

 d1.doubleValue() == d2.doubleValue()

双精度浮点数是存储在内存中固定空间中的数字 的近似值。

为了正确比较浮点数,您需要注意,由于浮点数的性质,会有一些错误。

请参阅:http ://www.google.com/search?q=floating+point+equality

比较双打的一种快速简便的方法是使用Math.abs(a-b)<ACCEPTABLE_ERROR where ACCEPTABLE_ERROR 可能.000000000001取决于您的具体操作。 (注意这不处理边缘情况,例如 NaN 和 INFINITY)

于 2008-12-26T01:58:04.183 回答
2

您不希望使用 != 运算符。它比较参考。你想要的.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 到 a Floatnot a Double,这可能会破坏您的比较。将结果与 进行比较test.search(20.1d)。如果我没记错的话,表达式:

new Float(20.1).equals(new Double(20.1))

是假的。

于 2008-12-26T01:43:51.077 回答