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 が数値を正しく比較していないように見えます。

EDIT:ところで、BigDecimalも同じ種類の問題を私に与えました。

EDIT 2: equals() は機能しましたが、他に何か問題があることに気づきませんでした。ごめん。

4

2 に答える 2

11

を使用してdouble.equals()を比較すると、エラーが発生する可能性があることに注意してください。これを等価テストとして使用します。Double.equals()

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

doublefloatは、メモリ内の固定スペースに格納された数値の 近似値です。

浮動小数点数を正しく比較するには、浮動小数点数の性質上、多少の誤差が生じることに注意する必要があります。

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

double を比較するための迅速かつ簡単な方法は、正確に何をしているかに応じて Math.abs(a-b)<ACCEPTABLE_ERROR ACCEPTABLE_ERROR になる可能性がある場所を使用することです。(これは NaN や INFINITY などのエッジ ケースを処理しないことに注意してください).000000000001

于 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 が ではFloatないことに気付くかもしれませんがDouble、これはおそらく比較を壊します。結果を と比較しますtest.search(20.1d)。私の記憶が正しければ、表現は次のとおりです。

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

は偽です。

于 2008-12-26T01:43:51.077 に答える