web-dev-qa-db-fra.com

Implémenter Java Comparator

J'essaie d'écrire un algorithme qui utilise une file d'attente à priorité minimale, j'ai donc regardé autour de Google et trouvé la PriorityQueue. Il semble cependant que pour l'utiliser, je vais devoir lui dire comment je veux qu'il soit prioritaire, et que la façon de le faire soit avec un comparateur (je veux comparer des champs de données spécifiques de mon "Node1" objets). Plus de recherche sur Google a présenté l'idée de créer un nouveau comparateur qui implémente Comparateur mais remplace la méthode de comparaison. Ce que j'essaie, c'est ceci (et d'autres variantes de celui-ci également):

import Java.util.Comparator;

public class distComparator implements Comparator {

    @Override
    public int compare(Node1 x, Node1 y){
        if(x.dist<y.dist){
            return -1;
        }
        if(x.dist>y.dist){
            return 1;
        }
        return 0;
    }
}

Le compilateur proteste pour plusieurs raisons, dont l'une est que je n'ai pas outrepassé la classe de comparaison (qui, selon lui, est abstraite)

erreur: distComparator n'est pas abstrait et ne remplace pas la méthode abstraite compare (Object, Object) dans Comparator

Je l'ai changé pour dire "comparer (objet x, objet y)", qui s'occupe de ce problème. À ce stade, le compilateur se plaint de ne pas trouver la variable "dist" dans x ou y - ce qui est logique, car ils font partie de ma classe Node1, pas de la classe Object.

Alors, comment est-ce censé fonctionner? Il devrait avoir le type Object, apparemment, mais comment puis-je le diriger vers la bonne variable?

15
Jo.P

Vous devez implémenter Comparator<Node1>:

public class distComparator implements Comparator<Node1> {
                                                 ^^^^^^^

Sans cela, vous implémentez Comparator<Object>, ce qui n'est pas ce que vous voulez (cela peut fonctionner, mais cela ne vaut pas la peine).

Le reste du code de votre question est correct, à condition que Node1 a un membre accessible appelé dist.

Notez que si vous utilisez Java 7, le corps entier de la méthode peut être remplacé par

return Integer.compare(x.dist, y.dist);

(remplacez Integer par Double etc, selon le type de Node1.dist.)

17
NPE

Comme vous pouvez le voir ici (la page JavaDoc du comparateur JSE) , l'interface Comparator a un "paramètre" générique décrivant le type pour lequel ce comparateur est conçu. PriorityQueue est similaire.

Donc, si vous créez un PriorityQueue<Node1>, vous pouvez créer un Comparator<Node1> comme suit:

public class distComparator implements Comparator<Node1> {    
    @Override
    public int compare(Node1 x, Node1 y){
        return x.dist - y.dist;
    }
}
3
vptheron