Frage

Ich habe eine verknüpfte Liste, mit Einsatz, Such- und Funktionen entfernen. Ich habe auch einen Iterator für sie. Nun nehme ich dies tun:

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());

Und voila, es funktioniert (es gibt den Wert des Elements an dem Knoten, in diesem Fall 20). Nun, wenn ich dies tun:

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());

Es ist nicht, weil der Iterator auf null zeigt. Hier ist die Umsetzung der Suchfunktion:

public iterator search(T data)
{
    no<T> temp = first;
    while( (temp != null) && (temp.data != data) )
        temp = temp.next;
    return (new iterator(temp));
}

Hier ist, wie ich weiß, dass es etwas faul mit den Vergleichen: Wenn ich Teil des obigen Code wie folgt ändern:

while( (temp != null) && (temp.data != data) )
     System.out.println(temp.data + " " + data);
     temp = temp.next;

Ich kann es sehen die Zahlen in der Liste zu drucken. Er druckt, an einem Punkt „20.1 20.1“ (zum Beispiel). Also, wie kann ich dieses Problem beheben? Die Funktion erscheint richtig zu sein, aber es scheint so, als ob Java ist nicht die Zahlen richtig zu vergleichen.

EDIT: wth, gab BigDecimal mir die gleiche Art von Problem zu

.

EDIT 2: equals () arbeitete, war nicht klar etwas anderes nicht in Ordnung war. Es tut uns Leid.

War es hilfreich?

Lösung

Sie wollen nicht den Operator! = Für diese. Es comapres Referenzen. Sie möchten die .equals() Methode:

public iterator search(T data)
{
    no<T> temp = first;
    while (!data.equals(temp.data)) {
        temp = temp.next;
    }
    return (new iterator(temp));
}

Auch achten Sie auf Auto-Boxen . Sie können von diesem test.search(20.1) Boxen 20.1 auf einen Float finden keinen Double, die wahrscheinlich Ihren Vergleich zu brechen. Vergleichen Sie die Ergebnisse mit test.search(20.1d). Wenn ich mich richtig erinnere, der Ausdruck:

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

ist falsch.

Andere Tipps

Beachten Sie, dass .equals() mit vergleichen verdoppelt zu Fehlern führen kann. Double.equals() verwendet diese als seinen Gleichheitstest:

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

Doubles und schwimmt ist Annäherungen von Zahlen in einem festen Platz im Speicher abgelegt.

Um richtig zu vergleichen Gleitkommazahlen , Sie müssen sich bewusst sein, dass aufgrund der Art von Schwimmern, wird es einige Fehler.

siehe: http://www.google.com/search?q = Floating + Punkt + Gleichheit

Eine schnelle und einfache Art und Weise verdoppelt zu vergleichen ist Math.abs(a-b)<ACCEPTABLE_ERROR zu verwenden wo ACCEPTABLE_ERROR .000000000001 je nach werden könnte, was genau Sie tun. (Hinweis: Dies ist nicht Rand Fällen wie NaN und INFINITY umgehen kann)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top