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 :

Tri Liste par colonne d'objets


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Points : 58
    Points
    58
    Par défaut Tri Liste par colonne d'objets
    Bonjour,

    je veux savoir si en java, on peut trier une ArrayList d'objets par rapport à une colonne de l'objet...
    Quand je remplis ma liste d'objets, et j'utilise la méthode :
    Collections.sort(liste);

    j'ai une exception :
    java.lang.ClassCastException
    at java.util.Arrays.mergeSort(Arrays.java:1152)
    at java.util.Arrays.sort(Arrays.java:1079)
    at java.util.Collections.sort(Collections.java:113)
    at test.Test.main(Test.java:38)
    Exception in thread "main"


    Merci par avance

  2. #2
    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,


    Les objets de la liste doivent implémenté Comparable.

    Si ce n'est pas le cas il faut utiliser la seconde méthode sort() en lui passant en plus un Comparator qui permettra de comparer deux éléments entre eux...

    a++

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Je ne vois vraiment pas comment utiliser le Comparator que l'on passe en paramètre, ce que je veux, c'est trier la liste ou le Set sur la base d'un paramètre de mon objet : "currentYear"

    Merci pour ton aide

  4. #4
    Invité
    Invité(e)
    Par défaut
    Le problème c'est qu'il faut que la méthode sort "sache" que c'est l'attribut currentYear qui va servir de discriminant pour la comparaison. Et c'est ton objet Comparator qui va le lui dire.

    Le fait de passer par un objet de type Comparator permet de faire des comparaisons plus complexes que simplement comparer un attribut de tes objets.

    On pourrait imaginer par exemple des comparaisons de vecteurs où la comparaison porterait sur la norme de ceux-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Vector {
        int x;
        int y;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class VectorComparator implements Comparator<Vector> {
     
        @Override
        public compare(Vector vect1, Vector vect2) {
            int norme1 = (vect1.x)² + (vect1.y)²;
            int norme2 = (vect2.x)² + (vect2.y)²;
            return norme1 - norme2;
        }
     
    }
    http://java.sun.com/javase/6/docs/ap...omparator.html

    Note : Comparator est une interface, il faut que tu crées ta propre classe implémentant Comparator comme je l'ai fait ici avec VectorComparator.

  5. #5
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    j'ai rajouté dans ma classe d'objet ClassTest qui implémente Comparator la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public int compare(ClasseTest o1, ClasseTest o2) {
    		if(o1.getCurrentYear().intValue() <= o2.getCurrentYear().intValue())
    			return 1;
    		else
    			return -1;
    }
    mais je ne vois pas comment passer le paramètre à la méthode sort, peux tu être plus clair ?

    Merci

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Lorsque tu souhaites trier une liste (ArrayList, LinkedList... : classes dérivées de Collection) par un paramètre bien spécifique, tu dois utiliser la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Collections.sort(taListe,new ColonneComparator());
    "new ColonneComparator()" représente un objet (Comparator) de colonnes puisque c'est ce que tu souhaites. Tu dois déclarer une nouvelle classe dans ton projet appeléé ainsi (ColonneComparator) qui doit implémenter l'interface (Comparable ou Comparator, je ne sais jamais laquelle c'est). Cette nouvelle classe te servira à implémenter la méthode compare() pour comparer les paramètres bien spécifiques que tu souhaites traîtés pour le tri.
    J'espère avoir été clair.

  7. #7
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    Bonjour,

    pour la mise en place du comparateur dan ta classe tu peux par exemple :
    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
    public class ClasseTest {
     
        public static final Comparator<ClasseTest> YEAR_COMPARATOR = new Comparator<ClasseTest>() {
     
            public int compare(ClasseTest o1, ClasseTest o2) {
                return (o1.getCurrentYear().compareTo(o2.getCurrentYear()));
            }
     
        };
     
        private Integer currentYear;
     
        public Integer getCurrentYear() {
            return currentYear;
        }
     
        ....
     
    }
    l'appel du tri se fera alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(liste,ClasseTest.YEAR_COMPARATOR);

  8. #8
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Merci de ton aide...

    Je ne vois toujours pas comment ca marche, le type de retour de la méthode compare() représente quoi ? et il est utilisé ou ?
    j'ai rajouté la classe comme tu as dis, et la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public int compare(Object arg0, Object arg1) {
    		if(((ClasseTest)arg0).getCurrentYear().intValue() <= ((ClasseTest)arg0).getCurrentYear().intValue())
    			return 1;
    		else
    			return -1;
    	}
    Quand je teste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(liste, new CurrentYearComparator());
    ça ne change rien

  9. #9
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 125
    Points : 58
    Points
    58
    Par défaut
    Ok, j'ai testé le code de fnobb et ca marche bien..

    Merci à tous pour votre aide

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 49
    Points : 38
    Points
    38
    Par défaut
    Bonjour
    Moi aussi j'essaie de trier deslistes d'objets selon des critères différents : ton exemple , fnobb, me convient bien : j'ai écrit autant de méthodes que de critèresdifférents souhaités
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static final Comparator<ClasseTest> YEAR_COMPARATOR = new Comparator<ClasseTest>() {
     
            public int compare(ClasseTest o1, ClasseTest o2) {
                return (o1.getCurrentYear().compareTo(o2.getCurrentYear()));
            }
     
        };
    Comme je ne maitrise pas encore bien les subtilités de java (souvent je me contente de reprendre un existant et de le changer selon mes besoins), j'aimerais savoir ce que signifie ce ';' (en rouge) après le caractère "}" ?

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

Discussions similaires

  1. tri automatique par colonne datagrid WPF
    Par abadou2012 dans le forum C#
    Réponses: 1
    Dernier message: 24/03/2014, 10h30
  2. tri automatique par colonne datagrid WPF
    Par yayasam dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 03/05/2010, 11h06
  3. Tri list par ordre alphabétique
    Par mbadjo79 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 29/04/2009, 10h01
  4. Réponses: 3
    Dernier message: 11/04/2008, 15h37
  5. trier une liste par colonnes
    Par Sniper37 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 26/10/2007, 10h19

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