Probleme mit dem Vergleich von zwei generischen Objekten

stimmen
1

Mein Projekt ist ein Telefonbuch , das verwendet BSTree<E>. Jeder Knoten des Baumes ist BTNode<E>. In der Hauptklasse, ich ersetzen E mit Pair - Klasse, die hat (String name, String number), wenn ich die Knoten definieren.

Ich habe folgende Vergleichsklasse zwischen 2 E-Typen vergleichen:

import java.util.Comparator;

public class BTNodeComparator<E> implements Comparator<E>
{
    public int compare(E a, E b) throws ClassCastException
    {
        return ((Comparable<E>) a).compareTo(b);
    }
}

und ich benutze es in BSTree<E>.

Nun, wenn ich das Programm ausführen, und es kommt zu dem Komparator, es gibt mir Fehler am Komparator, weil jetzt ist es zwischen zwei Paaren vergleicht

Wie kann ich dieses Problem lösen? Was ich will, ist zwischen den Namen der beiden Paare zu vergleichen?

Sorry für meine schlechte Erklärung. Mein Englisch ist schwach.

=========================

Bearbeiten:

@ Tim: Nach Ihrer Lösung versuchen, es gibt mir diese Fehlermeldung:

java.lang.NullPointerException
    at Pair.compareTo(Pair.java:36) // @ return name.compareTo(pair.getName());
    at Pair.compareTo(Pair.java:2)  // @ public class Pair implements Comparable<Pair>
    at BTNodeComparator.compare(BTNodeComparator.java:24) // @ return (a.compareTo(b));
    at BTNodeComparator.compare(BTNodeComparator.java:20) // @ public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E>
    at BSTree.search(BSTree.java:285)
    at BSTree.insert(BSTree.java:300)
    at PhoneBook.main(PhoneBook.java:25)

Übrigens, ich decleared BTNodeComparator in BSTree wie folgt:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
Veröffentlicht am 06/05/2011 um 02:16
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
2

Die einzig mögliche Scheitern ich sehen konnte , ist ClassCastException. Um dies zu beheben Code müssen Sie Ihre angeben PairKlasse wie folgt:

class Pair implements Comparable<Pair> {
    String name;
    String number;

    //some implementation stuff...

    @Override
    public int compareTo(Pair o) {
        return name.compareTo(o.name);
    }
}

Im Allgemeinen, wenn Ihre ComparatorImplementierung der Umsetzung auf der generischen Art beruht , Comparabledann sollten Sie es wie folgt angeben:

public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E> {
    public int compare(final E a, final E b) {
        return a.compareTo(b);
    }
}

Dabei gibt Ihnen nur Zeit Sicherheit ohne Änderung der Semantik wie die kompilieren Comparatorfunktioniert.

Basierend auf Ihren Kommentar, ich nehme an Sie sind die Einbettung BTNodeComparatorin die BSTreeKlasse als verschachtelte Innenklasse, die Sie wahrscheinlich bedeutet nicht , dass Veränderungen vornehmen , ohne die Typdefinition in der sich verändernden BSTreeErklärung.

Beantwortet am 06/05/2011 um 02:27
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more