Problemi con confronto di due oggetti generici

voti
1

Il mio progetto è una rubrica che utilizza BSTree<E>. Ogni nodo dell'albero è BTNode<E>. Nella classe principale, sostituisco E con classe di coppia, che ha (String name, String number), quando io definisco i nodi.

Ho la seguente classe di confronto per confrontare tra 2 tipi E:

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

e lo uso in BSTree<E>.

Ora, quando faccio funzionare il programma e si tratta del confronto, mi dà errori al comparatore perché ora mette a confronto tra due coppie

Come posso risolvere questo problema? Quello che voglio è quello di confrontare tra i nomi delle due coppie?

Ci dispiace per il mio cattivo spiegazione. Il mio inglese è debole.

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

Modificare:

@ Tim: Dopo aver provato la soluzione mi dà questo errore:

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)

A proposito, ho decleared BTNodeComparator in BSTree come segue:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
È pubblicato 06/05/2011 alle 02:16
fonte dall'utente
In altre lingue...                            


1 risposte

voti
2

L'unico fallimento possibile ho potuto vedere è ClassCastException. Per risolvere il codice è necessario specificare il Pairclasse come questa:

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

    //some implementation stuff...

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

In generale, se la vostra Comparatorapplicazione si basa sul tipo generico attuazione Comparableallora è necessario specificare in questo modo:

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

In questo modo dà solo si compila la sicurezza di tempo senza cambiare la semantica di come le Comparatoropere.

Sulla base della sua commento, sto cercando di indovinare si intende inserire la vostra BTNodeComparatornella BSTreeclasse come un annidata interna di classe, che significa che probabilmente non può fare che il cambiamento senza cambiare la definizione del tipo nella BSTreedichiarazione.

Risposto il 06/05/2011 a 02:27
fonte dall'utente

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