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

Collection et Stream Java Discussion :

Trier une liste d'objets d'après un champ des objets


Sujet :

Collection et Stream Java

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut Trier une liste d'objets d'après un champ des objets
    Bonjour,

    J'ai liste d'objets de type maClasse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<maClasse> liste = new ArrayList<maClasse>();
    Les objets de type maClasse ont différents champs dont l'un d'eux est total

    J'aimerais trier cette liste de manière à avoir en premier dans la liste, l'objet dont le champ total est le plus grand.

    Qqun a-t-il une idée de comment je pourrais faire cela ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Tu fais implémenter l'interface "Comparable" à ton objet, et tu définis dans ta méthode "compareTo" le champ qui sert à les comparer (et à les trier).

    Cette simple manipulation te permettra d'utiliser les méthodes de tri déjà implémentées dans java (SortedList, etc...)

    C'est la méthode la plus simple et la plus propre.

    Ensuite, tu peux également réécrire à la main une méthode de tri de tes objets...
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Le problème est que je ne peux faire implémenter a ma classe que l'interface java.util.comparator<T>, il n'y a pas java.util.comparable.


    Et dans ce cas je dois implémenter la méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public int compare(Compte o1, Compte o2) {
    		Double tot1 = o1.getTotal();
    		Double tot2 = o2.getTotal();
     
    		if (tot1 > tot2) {
    			return -1;
    		} else if (tot1 == tot2) {
    			return 0;
    		} else {
    			return 1;
    		}
    	}
    Quand je veux trier avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(listCompte)
    il me vient l'erreur suivante:

    Severity and Description Path Resource Location Creation Time Id
    Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<Compte>). The inferred type Compte is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>
    A moins qu'elle vienne d'un autre package ?

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    En fait je viens de remarquer qu'elle appartient au package:

    java.lang

    et non java.util

    Merci pour ton aide

  5. #5
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Mais tu peux également utiliser un Comparator, ce qui peut être très pratique lorsque tu souhaite modifier le type de comparaison.

    Pour cela il suffit d'utiliser la méthode sort() adéquate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(listCompte, tonComparator);
    a++

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Je ne vois pas comment utiliser comparator.

    En implémentant java.util.comparator, je dois également avoir la méthode compare(Objet o1, Objet o2).

    Dans mon cas, j'implémente java.lang.comparable et j'ai compareTo()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public int compareTo(Compte o) {
    		Double tot1 = o.getTotal();
    	    Double tot2 = this.getTotal(); 
    	    if (tot1 > tot2) {
    	    	return -1; 
    	    } else if (tot1 == tot2) {
    	    	return 0; 
    	    } else {
    	    	return 1; 
    	    }
    	}
    Ce qui me permet de trier d'après le champ "total".

    Maintenant j'aimerais pouvoir trier mes objet plutot avec le champ nom (getNom(), pour avoir les objet groupés par nom) (tout en conservant la possibilité de trier avec le champ total (getTotal())),
    pour cela il faut donc que j'utilise compare(Objet 01, Objet o2) de l'interface Comparator, mais je ne vois pas comment définir cette méthode et après appeler la méthode (Collections.sort()) adéquate pour que cela marche

    Peux-tu m'en dire plus stp ?

    Merci d'avance

  7. #7
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Personne ne peut m'aider?

  8. #8
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gids01
    Personne ne peut m'aider?
    Ben il suffit d'utiliser la méthode sort() avec 2 paramètres : ta liste et ton comparator.

    Je ne vois pas trop le problème ?

    a++

  9. #9
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Dans la méthode compare(Objet o1, Objet o2),

    comment faire pour tester une fois le champ "total" et une autre fois, le champ "nom" ?

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

Discussions similaires

  1. Trier une liste d'objets
    Par christophertux dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 04/08/2009, 16h49
  2. Réponses: 5
    Dernier message: 22/02/2009, 18h44
  3. Réponses: 3
    Dernier message: 27/01/2009, 18h17
  4. trier une liste d'objets dans une ArrayList
    Par sandrine49 dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 13/10/2008, 08h59
  5. trier une liste d'objets
    Par jeremy_d dans le forum C#
    Réponses: 4
    Dernier message: 12/06/2008, 13h50

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