Problemer med å sammenligne to generiske objektene

stemmer
1

Mitt prosjekt er en telefonbok som bruker BSTree<E>. Hver node i treet er BTNode<E>. I hovedklassen, jeg erstatte E med Pair klasse, som har (String name, String number), når jeg definerer nodene.

Jeg har følgende komparatoren klassen for å sammenligne mellom 2 E typer:

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

og jeg bruker det i BSTree<E>.

Nå, når jeg kjører programmet og det kommer til komparator, det gir meg feil på komparator fordi nå er det sammen mellom to par

Hvordan kan jeg løse dette problemet? Det jeg ønsker er å sammenligne mellom navnene på de to parene?

Sorry for min dårlige forklaring. Min engelsk er svak.

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

Redigere:

@Tim: Etter å ha prøvd løsningen gir meg denne feilmeldingen:

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, jeg erklæring av BTNodeComparator i BSTree som følger:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
Publisert på 06/05/2011 klokken 01:16
kilden bruker
På andre språk...                            


1 svar

stemmer
2

Den eneste mulige feil jeg kunne se er ClassCastException. For å fikse koden din, må du angi din Pairklasse som dette:

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

    //some implementation stuff...

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

Generelt, hvis Comparatorgjennomføringen er avhengig av generisk type implementering Comparablebør du spesifisere det slik:

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

Gjør du det bare gir deg kompilering sikkerhet uten å endre semantikk av hvordan den Comparatorfungerer.

Basert på kommentaren din, jeg gjetter du bygge din BTNodeComparatorinn i BSTreeklassen som en nestet indre-klassen, noe som betyr at du sannsynligvis ikke kan gjøre denne endringen uten å endre type definisjon i BSTreeerklæringen.

Svarte 06/05/2011 kl. 01:27
kilden bruker

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