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

avec Java Discussion :

Trier avec Comparable


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut Trier avec Comparable
    Bonsoir;


    je cherche à implémenter comparable; mais j'avoue que je galère un peu.


    Admettons une classe


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Etudiant {
     
       public String nom;
       public int numero;
     
    public Etudiant(String s, int n) {
               this.nom=s;
               this.numero=n;
         }
     
    }

    Je sais que je dois implements comparable

    Et donc faire la méthode compareTo; mais je n'arrive pas à le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Ecole {
       List<Etudiant> l;
     
        public Ecole(){
                 List<Etudiant> l=new ArrayList<Etudiant>();
         }
     
          public void addEtu(Etudiant e){
                     l.add(e);
     
               }
     
    }

    Comment faire en sorte dans un premier temps que la liste d'étudiant de l'école s'affiche dans l'ordre alphabétique des noms; puis dans une second temps dans l'ordre des numéros croissant.


    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Implémente l'interface Comparable sur la classe Etudiant (public class Etudiant implements Comparable<Etudiant>), ce qui signifie implémenter la méthode int compareTo(Etudiant) dans cette classe. Cette méthode compare l'étudiant passé en paramètre à celui pour qui la méthode est appelée. Cette méthode permet d'indiquer l'ordre naturel entre l'objet (pour lequel on appelle la méthode) et celui passé en paramètre. Elle doit retourner :

    • un nombre négatif (en général -1) si l'objet est avant celui passé en paramètre (ou "inférieur") ;
    • 0 si l'objet est égal à celui passé en paramètre (au même endroit en quelque sorte)
    • un nombre positif (en général 1) si l'objet est après celui passé en paramètre


    Lorsqu'on a 2 niveaux de tri (ici d'abord alphabétique), ensuite sur le numéro, le deuxième niveau ne s'applique que si on a 0 au premier (donc on tri selon les numéro 2 Etudiants qui ont le même nom).

    Pour comparer les noms, si on suppose qu'ils ne peuvent être null (sinon il faut gérer ce cas à part), on peut directement comparer les String :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public int compareTo(Etudiant o) {
    	int compare = nom.compareTo(o.nom);
            if ( compare==0 ) { // les noms sont égaux
               // ici on compare les numéros...
            }
    	return compare;
    }
    Je te laisse complèter...

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut
    Merci beaucoup !


    J'en déduis que lorsqu'il s'agit de string la méthode existe déjà ?

    Lorsque tu écris cela; on fait appel à la méthode compareTo de String qui est prédéfini ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int compare = nom.compareTo(o.nom);

    Cela veut dire que; si j'avais voulu seulement trier les nom; cette ligne était suffisante ?

    De même que si j'avais voulu seulement trier les numéros aurais le pu faire directement numero.compareTo(o.numero) ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Amnael Voir le message
    Merci beaucoup !


    J'en déduis que lorsqu'il s'agit de string la méthode existe déjà ?
    Oui, parce que String implémente Comparable.

    Citation Envoyé par Amnael Voir le message
    Lorsque tu écris cela; on fait appel à la méthode compareTo de String qui est prédéfini ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int compare = nom.compareTo(o.nom);
    Exact.

    Citation Envoyé par Amnael Voir le message
    Cela veut dire que; si j'avais voulu seulement trier les nom; cette ligne était suffisante ?
    Oui.
    Citation Envoyé par Amnael Voir le message
    De même que si j'avais voulu seulement trier les numéros aurais le pu faire directement numero.compareTo(o.numero) ?
    Et non, pas de chance. Parce que numero est de type int : un type primitif, pas une classe, et donc qui ne peut implémenter Comparable.

    Integer, qui est une classe, implémente Comparable, par contre.

    Pout comparer un int, on préféra comparer directement les int que de faire une conversion vers Integer, surtout que c'est simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if( numero<o.numero ) {
        ...
    } else if ( numero>o.numero ) {
     
       ...
    } else { // cas numero==o.numero
       ...
    }
    Il y a même une sorte d'astuce qui consiste à faire la différence entre numero et o.numero (je ne te dis pas dans quel ordre : tu devrais trouver assez facilement) : commme le retour de la méthode doit être négatif, 0 ou positif, la différence est valable pour déterminer le retour de la méthode.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut
    Super c'est tout ce qu'il me fallait savoir; merci beaucoup

    T'as même anticipé ma prochaine question avec Integer


    Une dernière question; il me semble avoir lu quelque part que lorsqu'on implémentait comparable il fallait définir compareTo; mais également equals. C'est une obligation pour le equals ou on peut s'en passer ?
    Parce que franchement je vois pas trop à quoi il servirait dans ce cas là...

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Amnael Voir le message
    Une dernière question; il me semble avoir lu quelque part que lorsqu'on implémentait comparable il fallait définir compareTo; mais également equals. C'est une obligation pour le equals ou on peut s'en passer ?
    Parce que franchement je vois pas trop à quoi il servirait dans ce cas là...
    Ce n'est pas obligatoire mais recommendé.
    On doit le faire par cohérence : si on ne le fait pas, certaines méthodes de certaines classes pourraient ne pas se comporter comme attendu. D'ailleurs, ce n'est pas la seule chose qu'on doit faire par cohérence :

    • l'implémentation de comparable doit être stable : si elle retourne une valeur pour 2 instances données, elle doit toujours retourner cette même valeur.
      Pas question donc de faire
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      public int compareTo(Etudiant e) [
          return 1-(int)(Math.random()*3); 
      }
    • E1.compareTo(E2) doit être égale à -E2.compareTo(E1).
    • puis qu'on doit implémenter equals() de manière cohérente : si E1.compareTo(E2)==0 est vraie , alors E2.compareTo(E1)==0 est vraie et E1.equals(E2) est vraie, et E2.equals(E1) est vraie
    • puisqu'on implémente equals(), il faudrait également implémenter hashCode(), de manière à ce que si E1.equals(E2) est vraie alors E1.hashCode()==E2.hashCode() est vraie.


    A noter une chose particulière (l'exception à la règle ) : si equals(null) peut retourner false (elle doit retourner false, ou faire une NullPointerException, au pire une IllegalArgumentException), compareTo(null) devrait soulever une NullPointerException. On considère que null ne peut avoir d'ordre naturel particulier avec une instance d'une classe quelconque (ceci n'est pas applicable aux Comparator chargés de définir un ordre autre que l'ordre naturel).

Discussions similaires

  1. Probleme avec comparator
    Par imanoual dans le forum Langage
    Réponses: 2
    Dernier message: 10/10/2008, 15h15
  2. Réponses: 4
    Dernier message: 19/02/2008, 14h46
  3. trier avec 2 critéres une table
    Par lionelpopo dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/09/2006, 23h12
  4. [Oracle] Trier avec une extraction au sein du chaine de car
    Par magic charly dans le forum Langage SQL
    Réponses: 13
    Dernier message: 14/04/2006, 16h26
  5. [debutante][list] trier avec sort()
    Par norkius dans le forum Débuter
    Réponses: 10
    Dernier message: 24/10/2005, 19h13

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