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 :

Problème de tri dans une liste


Sujet :

avec Java

  1. #1
    Membre régulier
    Inscrit en
    Avril 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 32
    Points : 89
    Points
    89
    Par défaut Problème de tri dans une liste
    Bonjour j'ai un petit problème pour un de mes projets.

    C'est vraiment une erreur bête qui doit être quelque part mais je ne la vois pas.

    J'ai besoin de trier par ordre alphabétique une liste contenant plusieurs objets du même type. Je veux qu'ils soient classé par ordre alphabétique du nom.

    J'ai ça comme 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
    18
    19
    20
    21
    22
    23
    24
     
    import java.util.*;
    public class main {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
     
                    List<Ingredient> list3 = new LinkedList<Ingredient>();
     
    		list3.add(new Ingredient("b","liquide",0.5,true));
    		list3.add(new Ingredient("c","liquide",4,true));
    		list3.add(new Ingredient("a","solide", 0.4,true));
     
    		System.out.println(list3);
     
    		Collections.sort(list3);
     
    		System.out.println(list3);
     
    	}
     
    }
    Mon type Ingredient est relativement basique et j'ai bien pensé à redéfinir la méthode compareTo() afin de pouvoir trier correctement des objets de type Ingredient.

    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
     
    import java.util.*;
     
    public class Ingredient implements Comparable{
     
    	public String nom;
    	protected String type;
    	protected boolean simple;
    	protected double quantite;
     
     
    	public Ingredient(String nom, String type, double quantite)
    	{
    		this.nom = nom;
    		this.type = type;
    		this.quantite = quantite;
    		this.simple = true;
    	}
     
    	public Ingredient(String nom, String type, double quantite, boolean simple)
    	{
    		this.nom = nom;
    		this.type = type;
    		this.quantite = quantite;
    		this.simple = simple;
    	}
     
     
    	public int compareTo(Ingredient i) 
    	{
    		return this.getNom().compareTo(i.getNom());
    	}
     
    	@Override
    	public int compareTo(Object o) {
    		// TODO Auto-generated method stub
    		return 0;
    	}
     
     
    }
    Je n'ai volontairement pas mis toutes les méthodes de ma classe Ingredient.

    Et lors de l'exécution j'ai ça

    [Nom : b 0.5, Nom : c 4.0, Nom : a 0.4] <-- liste avant le tri
    [Nom : b 0.5, Nom : c 4.0, Nom : a 0.4] <-- liste après le tri mais qui n'est toujours pas triée.

    Je m'en remet à vous je ne vois pas trop ce qui m'empêche de faire un tri correct.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par zatura Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    	@Override
    	public int compareTo(Object o) {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    Votre méthode de tri ne fait strictement rien là!

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Salut,

    Voir cette FAQ:

    http://java.developpez.com/faq/java/...rierCollection

    Cordialement,

    Dan

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    Bonjour,

    Moi ce que je ne comprend pas c'est pourquoi la méthode qui prend un Object en paramètre prévaut sur la méthode qui prend un Ingrédient ?

    Merci d'avance

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    parce que la seule et unique méthode que défini Comparable, c'est compareTo(Object) et que c'est donc celle là que tout ce qui traite des Comparable va utiliser.

    L'autre méthode, tu l'a définie, c'est bien, mais à part toi, personne ne la connait.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    logique

    En revanche si on implémente Comparable<Ingredient> j'imagine que la méthode utilisée par défaut serait celle qui prend un Ingrédient en paramètre ?

    Merci de ta réponse

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Oui.
    Et non


    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
    public class Main implements Comparable<Main>{
     
     
    		public int compareTo(Main machin){
    			return 0;
    		}
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		for (Method method: Main.class.getDeclaredMethods()){
    			System.out.println(method.toGenericString());
    		}
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static void Main.main(java.lang.String[])
    public int Main.compareTo(Main)
    public int Main.compareTo(java.lang.Object)

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    dur !!

    Ca mérite quelques tests (il me semblait pourtant bien que dans le livre de la SCJP c'était compareTo(Type xxx) qui était utilisé)

    voilà je doute maintenant, c'est malin

    Merci de ta réponse

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    C'est parce que en java les generiques n'existent qu'à la compilation. Les classes ne sont pas Réifiée. Ainsi, si je fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Comparable<Ingredient> a = new Ingredient();   // ok.
    Comparable b = a; //si si, ok :)
    b.compareTo(new Object());  // donc la méthode compareTo(Object) doit exister :mouarf:
    Maintenant, allons plus loin. Collection.sort prend en paramètre un <T extends Comparable<T>>, elle ignore à la compilation qu'on va travaillier concrètement avec un <Ingredient implements Comparable<Ingredient>>. Donc le bytecode généré ne fait référence qu'au seul Type connu pour T à la compilation: Comparable<Object>. Donc la méthode compareTo(Object) doit exister

    Preuve supplémentare de ce besoin, ce code ne compilera pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Test implements Comparable<Test>{
       public int compareTo(Test test){return 0;};
       public int compareTo(Object o){return 0;}; // erreur
       public int compareTo(String s){return 0;} // aucune utilisé mais ne pose pas de problème :)
    }

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 75
    Points
    75
    Par défaut
    Mon esprit ne s'en remettra pas

    Merci pour les explications

Discussions similaires

  1. Problème de format dans une liste SharePoint
    Par tipierre76 dans le forum SharePoint
    Réponses: 1
    Dernier message: 05/06/2008, 20h21
  2. tri dans une liste déroulante
    Par paolo2002 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 27/02/2008, 12h45
  3. [MySQL] problème d'affichage dans une liste
    Par bromlecornu dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/05/2007, 16h08
  4. [FLASH 8] Problème de sélection dans une liste
    Par jpboogie dans le forum Flash
    Réponses: 3
    Dernier message: 29/09/2006, 14h12
  5. [CSS] Problème d'espaces dans une liste
    Par sylsau dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 03/08/2006, 13h46

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