Problèmes liés à la comparaison de deux objets génériques

voix
1

Mon projet est un répertoire qui utilise BSTree<E>. Chaque nœud de l'arbre est BTNode<E>. Dans la classe principale, je remplace E avec la classe pair, qui a (String name, String number), lorsque je définis les noeuds.

J'ai la classe de comparaison ci-dessous pour comparer entre 2 types 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);
    }
}

et je l' utilise dans BSTree<E>.

Maintenant, quand je lance le programme et il vient au comparateur, il me donne des erreurs au comparateur, car il compare maintenant entre deux paires

Comment puis-je résoudre ce problème? Ce que je veux est de comparer entre les noms des deux paires?

Désolé pour ma mauvaise explication. Mon anglais est faible.

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

Modifier:

@ Tim: Après avoir essayé votre solution, il me donne cette erreur:

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, je decleared BTNodeComparator en BSTree comme suit:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
Créé 06/05/2011 à 02:16
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Le seul échec possible que je pouvais voir est ClassCastException. Pour fixer votre code , vous devrez spécifier votre Pairclasse comme ceci:

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

    //some implementation stuff...

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

En général, si votre Comparatormise en œuvre repose sur le type générique mise en œuvre , Comparablealors vous devez le spécifier comme ceci:

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

Cela vous donne juste compilez la sécurité sans en changer la sémantique de la façon dont les Comparatortravaux.

Sur la base de votre commentaire, je devine que vous intégrez votre BTNodeComparatordans la BSTreeclasse comme une classe imbriquée interne, ce qui signifie que vous pouvez probablement pas faire ce changement sans changer la définition de type dans la BSTreedéclaration.

Créé 06/05/2011 à 02:27
source utilisateur

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