Problemen met het vergelijken van twee generieke objecten

stemmen
1

Mijn project is een telefoonboek die wordt gebruikt BSTree<E>. Elk knooppunt van de boom is BTNode<E>. In de hoofdklasse, vervang ik E met Pair klasse, die heeft (String name, String number), toen ik de knooppunten definiëren.

Ik heb de volgende comparator klasse te vergelijken tussen 2 E types:

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

en ik gebruik het in BSTree<E>.

Nu, als ik het programma uit te voeren en het gaat om de vergelijker, het geeft me fouten in de vergelijker want nu vergelijkt tussen twee paren

Hoe kan ik dit probleem op te lossen? Wat ik wil is te vergelijken tussen de namen van de twee paren?

Sorry voor mijn slechte uitleg. Mijn Engels is zwak.

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

Bewerk:

@Tim: Na het uitproberen van uw oplossing geeft het me deze fout:

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)

BTW, ik werd verklaard BTNodeComparator in BSTree als volgt:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
De vraag is gesteld op 06/05/2011 om 02:16
bron van user
In andere talen...                            


1 antwoorden

stemmen
2

De enige mogelijke mislukking ik kon zien is ClassCastException. Om uw code te lossen moet u uw specificeren Pairklasse als volgt uit:

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

    //some implementation stuff...

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

In het algemeen, als uw Comparatorimplementatie is gebaseerd op de generieke soort uitvoering Comparabledan moet je opgeven als volgt uit:

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

Doen dus gewoon geeft je tijd om de veiligheid te compileren zonder dat de semantiek van hoe het Comparatorwerkt.

Op basis van uw commentaar, veronderstel ik uw ingebedde je BTNodeComparatorin de BSTreeklas als een geneste inner-klasse, die u betekent waarschijnlijk niet kunnen maken dat verandering zonder veranderen van het type definitie in de BSTreeverklaring.

antwoordde op 06/05/2011 om 02:27
bron van user

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