IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Bug Comparator with PriorityBlockingQueue ?


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut Bug Comparator with PriorityBlockingQueue ?
    Bonjour,

    Je voudrais créer une Queue dont les éléments sont ordonnés par rapport à leur priorité. J'ai créé un comparateur d'entiers tout simple mais celui-ci n'ordonne pas correctement ma liste.
    Avec le comparateur et le code test ci-dessous j'obtiens pour résultat 1, 0, 1 au lieu de 1, 1, 0.

    Est-ce qu'il existe un bug connu pour l'utilisation de la classe Comparator ou bien est-ce que j'ai mal codé ? (sans l'utilisation de ma classe Comparator l'ordonnancement est bon ...)

    Voici mon Comparateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    public class NewComp implements Comparator<Integer> {
     
        /**
         * default constructor
         */
        public NewComp() {
        }
     
        /**
         * Compare the priority level of two Integer
         * elements in argument.
         * 
         * @return <pre>
         *         1 if this priority level is lower 
         *         -1 if this priority level is higher 
         *         0 if the priority levels are equals
         * </pre> {@inheritDoc}
         */
        public int compare(Integer app1, Integer app2) {
     
            if (app1.intValue() > app2.intValue())
            {
                return -1;
            }
            else if (app1.intValue() < app2.intValue())
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
     
     
      public boolean equals(Integer app1, Integer app2) {
     
            boolean result = false;
     
            if (app1.intValue() == app2.intValue()) {
                result = true;
            }
     
            return result;
        }
    }

    Voici ma classe test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class TestComparator extends PriorityBlockingQueue<Integer>{
     
        public TestComparator(int capa, Comparator<Integer> comp)
        {
            //super();
            super(capa, comp);
        }
     
        /**
         * default constructor
         */
        public static void main (String[] args) {
            TestComparator test = new TestComparator(1, new NewComp());
            test.offer(new Integer(0));
            test.offer(new Integer(1));
            test.offer(new Integer(1));
            System.out.println("end");
        //Empty
        }
    }

    Merci par avance pour votre aide,

    Eva

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Ton implémentation de Comparator est correct (même si elle est perfectible). Le problème vient du fait que la méthode toString() n'affiche pas forcément les éléments selon leurs ordres.

    Il faut parcourir la PriorityQueue pour cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Integer i;
        while ( (i=test.poll()) != null) {
        	System.out.println(i);
        }

    A noter que pour un ordre inverse, tu peux utiliser directement Collections.reverseOrder() plutôt que de créer ton propre comparateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new TestComparator(1, Collections.<Integer>reverseOrder() );
    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut
    Merci !
    J'ai compris qu'il ne fallait pas itérer sur les champs de la queue (ou même se fier au contenu de la queue affiché dans le debugger).

    à +,
    Eva

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. bug msg d'erreur "compare validator"
    Par minisoucis dans le forum ASP.NET
    Réponses: 3
    Dernier message: 22/07/2015, 17h40
  2. Réponses: 4
    Dernier message: 18/12/2009, 11h09
  3. Eclipse "compare with" sur un dossier
    Par Cluster37 dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 20/04/2009, 09h58
  4. Compare with d'autres branches du CVS!
    Par assistibm dans le forum Eclipse
    Réponses: 0
    Dernier message: 26/02/2009, 10h50
  5. Simplifier l'utilisation de compare with et replace with
    Par guipom dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 08/01/2007, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo