Problemas con la comparación de dos objetos genéricos

votos
1

Mi proyecto es una guía telefónica que está utilizando BSTree<E>. Cada nodo del árbol es BTNode<E>. En la clase principal, sustituyo E con la clase Par, que tiene (String name, String number), cuando defino los nodos.

Tengo la siguiente clase comparador para comparar entre los 2 tipos 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);
    }
}

y lo uso en BSTree<E>.

Ahora, cuando ejecuto el programa y se trata de la comparación, me da errores en el comparador porque ahora se compara entre dos pares

¿Cómo puedo solucionar este problema? Lo que quiero es comparar entre los nombres de los dos pares?

Lo siento por mi mala explicación. Mi inglés es flojo.

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

Editar:

@Tim: Después de probar la solución que me da este error:

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)

Por cierto, me decleared BTNodeComparator en BSTree de la siguiente manera:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
Publicado el 06/05/2011 a las 02:16
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
2

El único fracaso es posible que pude ver es ClassCastException. Para solucionar el código tendrá que especificar su Pairclase como esta:

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

    //some implementation stuff...

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

En general, si su Comparatoraplicación se basa en la aplicación de tipo genérico Comparable, entonces debería especificar así:

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

Si lo hace, simplemente da la seguridad compila tiempo sin cambiar la semántica de cómo las Comparatorobras.

Basado en su comentario, supongo que al incrustar el BTNodeComparatoren la BSTreeclase como una clase anidada interior, lo que significa que probablemente no puede hacer que el cambio sin cambiar la definición del tipo de la BSTreedeclaración.

Respondida el 06/05/2011 a las 02:27
fuente por usuario

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