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

Java Discussion :

Tri de collections selon 3 critéres


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Services de proximité

    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut Tri de collections selon 3 critéres
    Bonjour,

    j'ai une ArrayList de produits que je veux trier selon le prix puis la désignation et enfin l'identifiant, si le prix est égal je trie par désignation et si la désignation est égale je trie par id, mais mon code n'affiche pas le résultat attendu, ma classe Produit implémente Comparable,

    voici mon code :

    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
      // Comparator pour le tri des produits par prix 
     
         public static Comparator<Produit> ComparatorPrix = new Comparator<Produit>() {
     
            @Override
     
            public int compare(Produit p1, Produit p2) {
     
                   if(p1.getPrix()!=(p2.getPrix())){return (int)(p1.getPrix()-(p2.getPrix()));
     
                   }else if((p1.getDesignation().compareTo(p2.getDesignation())!=0)) {
     
               return (int)(p1.getDesignation().compareTo(p2.getDesignation()));
     
                }else           return (int)(p1.getIdentifiant() - p2.getIdentifiant());
     
            }};
    MERCI d'avance pour votre aide

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 584
    Par défaut
    Et c'est quoi le résultat attendu et c'est quoi le résultat obtenu et comment tu as fait pour croire que tu avais pas besoin de le dire ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    À partir de java 8:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Comparator<Produit> comparatorPrix = Comparator.comparing(Produit::getPrix) // 1- Par le prix
    				.thenComparing(Produit::getDesignation) // 2- Par la désignation 
    				.thenComparing(Produit::getIdentifiant); // 3- Par l'identifiant
    A+.

  4. #4
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Par défaut
    Hello,

    Ta méthode compare() est beaucoup trop dense et presque illisible.
    Commences par y mettre des espaces entre les if et (, des sauts de ligne, et des alignements verticaux sur les {}.
    Si je voulais être pas trop gentil: mets donc tout cela sur une seule ligne!

    Quand tu es prêt, va dans ton outils de développement, par exemple Eclipse, et tu fais du pas à pas (débogage) sur chaque if et else, avec différents objets p1 et p2 correspondant à toutes les combinaisons possibles.
    Tu trouveras alors la ou les fautes, et tu seras assuré que ta méthode compare() fonctionne.
    Je l'ai déjà expliqué ici ou dans le groupe C++, il faut écrire des classes de tests, et ici aussi pour ce Comparator!

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Pour l’implémentation de la méthode compareTo de Comparable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Override
    public int compareTo(Comparator o){
    return Comparator.comparing(Produit::getPrix) // 1- Par le prix
    		.thenComparing(Produit::getDesignation) // 2- Par la désignation 
    		.thenComparing(Produit::getIdentifiant) // 3- Par l'identifiant
    		.compare(this, o); 
    }

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 584
    Par défaut
    Tout ça c'est bien joli, mais 'faudrait déjà qu'on sache précisément pourquoi son propre essai lui a pas plu.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Tout ça c'est bien joli, mais 'faudrait déjà qu'on sache précisément pourquoi son propre essai lui a pas plu.
    Je soupçonne que getPrix retourne un type objet (Double / Float...), donc p1.getPrix()!=(p2.getPrix()) sera toujours évalué à true. La classe Double/Float implémente déjà Comparable. Inutile aussi de caster en int la valeur retourner de compareTo de désignation puisque c'est déjà de type int. Si identifiant est de type Integer ou Long, il implémente aussi Comparable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(p1.getPrix().compareTo(p2.getPrix())!=0){
        	 return p1.getPrix().compareTo(p2.getPrix());
         }else if((p1.getDesignation().compareTo(p2.getDesignation())!=0)){
        	 return (p1.getDesignation().compareTo(p2.getDesignation()));
         }else{
        	 return (p1.getIdentifiant().compareTo(p2.getIdentifiant()));
         }
    Il faut aussi vérifier les null pour éviter un NullPointerException, pour mes premiers exemples:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Comparator.comparing(Produit::getPrix, Comparator.nullsFirst(Comparator.naturalOrder())) // voir aussi les autres méthode de Comparator (comparingDouble, ...)

    A+.

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

Discussions similaires

  1. [AC-2003] Tri de données selon un critère
    Par kisuke94 dans le forum Requêtes et SQL.
    Réponses: 19
    Dernier message: 09/12/2009, 12h12
  2. Réponses: 2
    Dernier message: 04/06/2008, 13h10
  3. Tri de colonnes selon 1 critère
    Par cynoq dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/01/2008, 14h43
  4. Tri d'une Chaine de Caractère selon un Critère
    Par compte dans le forum Langage
    Réponses: 10
    Dernier message: 24/01/2008, 15h57
  5. Tri de colonnes selon 1 critère
    Par cynoq dans le forum Excel
    Réponses: 1
    Dernier message: 23/01/2008, 21h04

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