我创建一个链表,与插入件,搜索和删除功能。我还创建了一个迭代器了。现在,假设我这样做:

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)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top