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 d'une liste d'objets en se basant sur leurs attributs


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut Tri d'une liste d'objets en se basant sur leurs attributs
    Bonjour à toutes et à tous,

    je dispose d'une liste de differents objets l'objectif est de pourvoir trier et alors selon ce tri affecté une valeur incrementale à un attribut de ces objets.

    sachant que ces objets disposent tous de deux attributs Ligne et colonne.
    l'ordre que je cherche dépend des deux valeurs ligne et colonne de chaque objet de cette liste , par exemple je vais chercher dans une premiere temps les éléments ayant la meme ligne et je commence à les trier en se basant sur la valeur de leurs colonnes et ainsi de suite pour les autres lignes.

    je rencontre des difficultés pour utiliser SORT est ce que vous avez une idée sur la bonne démarche pour trier cette liste ?

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Il faut que tu utilises l'interface Comparator.

    jette un oeil sur la faq :
    http://java.developpez.com/faq/java/...IONS_trier_map

  3. #3
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Il faut que tes objets implémentent Comparable.

    En définissant la méthode compareTo, tu peux effectuer le tri que tu veux. Je pense que tu trouveras un exemple dans la FAQ ...

    [EDIT] ou oui comparator ... voici un piti article pour te donner un exemple

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    Merci infiniment pour votre indication

    en fait j'ai commencé à implementer cette solution et j'ai rencontré quelques problemes...


    encore débutant je n'ai pas une idée sur la redefinition de la métode compareTo et j'ai besoin de votre aide


    j'ai ma classe UserElement avec les 2 attributs TOP (ligne) et Left (colonne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class UserElement extends JspPrinter {
     
     
    	private String top = null;
    	private String left = null;
    je veux tout d'abord lister chaque ligne et trier selon la colonne et ainsi de suite ..

    j'ai trouvé un petit exemple d'utilisation de compareTo

    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.Comparator;
    public class MonComparator implements Comparator
    {
      MonComparator()
      {
      }
      public int compareTo(Object arg0) 
      {
        Personne p1 = (Personne) arg0;
        Personne p2 = (Personne) arg1;
     
        int result = p1.name.compareTo(p2.name);
     
        if(result==0)
          result = p1.prenom.compareTo(p2.prenom);
     
      	return result;
      }
     
    }
    mais je ne sais pas d'ou il a recuperé l'objet arg1 !!!!!!!!


    est ce que chui dans le bon chemin ??

    merci

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Ne pas mélanger Comparator et Comparable.

    Le Comparator utilise bien la méthode compare(Object arg0, Object arg1) .

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup ça marche à merveille

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    Re Bonjour ,


    c'est vrai que ça marche mais c'est pas pour la totalité de la liste et je ne comprend pas pourquoi !!

    je vais vous donner le log du resultat obtenu et l'implementation que j'ai fait j'espere identifier le probleme

    voici le log :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
     
    L'élement a la ligne 1 et la colonne 1
    L'élement a la ligne 1 et la colonne 10
    L'élement a la ligne 1 et la colonne 13
    L'élement a la ligne 1 et la colonne 16
    L'élement a la ligne 1 et la colonne 19
    L'élement a la ligne 1 et la colonne 22
    L'élement a la ligne 1 et la colonne 25
    L'élement a la ligne 1 et la colonne 28
    L'élement a la ligne 1 et la colonne 4
    L'élement a la ligne 1 et la colonne 7
    L'élement a la ligne 10 et la colonne 1
    L'élement a la ligne 10 et la colonne 11
    L'élement a la ligne 10 et la colonne 14
    L'élement a la ligne 10 et la colonne 21
    L'élement a la ligne 10 et la colonne 24
    L'élement a la ligne 10 et la colonne 31
    L'élement a la ligne 10 et la colonne 34
    L'élement a la ligne 10 et la colonne 4
    L'élement a la ligne 10 et la colonne 41
    L'élement a la ligne 10 et la colonne 44
    L'élement a la ligne 11 et la colonne 1
    L'élement a la ligne 11 et la colonne 11
    L'élement a la ligne 11 et la colonne 21
    L'élement a la ligne 11 et la colonne 31
    L'élement a la ligne 11 et la colonne 41
    L'élement a la ligne 12 et la colonne 14
    L'élement a la ligne 12 et la colonne 24
    L'élement a la ligne 12 et la colonne 34
    L'élement a la ligne 12 et la colonne 4
    L'élement a la ligne 12 et la colonne 44
    L'élement a la ligne 13 et la colonne 1
    L'élement a la ligne 13 et la colonne 11
    L'élement a la ligne 13 et la colonne 14
    L'élement a la ligne 13 et la colonne 21
    L'élement a la ligne 13 et la colonne 24
    L'élement a la ligne 13 et la colonne 31
    L'élement a la ligne 13 et la colonne 34
    L'élement a la ligne 13 et la colonne 4
    L'élement a la ligne 13 et la colonne 41
    L'élement a la ligne 13 et la colonne 44
    L'élement a la ligne 14 et la colonne 1
    L'élement a la ligne 14 et la colonne 11
    L'élement a la ligne 14 et la colonne 21
    L'élement a la ligne 14 et la colonne 31
    L'élement a la ligne 14 et la colonne 41
    L'élement a la ligne 15 et la colonne 14
    L'élement a la ligne 15 et la colonne 24
    L'élement a la ligne 15 et la colonne 34
    L'élement a la ligne 15 et la colonne 4
    L'élement a la ligne 15 et la colonne 44
    L'élement a la ligne 16 et la colonne 1
    L'élement a la ligne 16 et la colonne 11
    L'élement a la ligne 16 et la colonne 14
    L'élement a la ligne 16 et la colonne 21
    L'élement a la ligne 16 et la colonne 24
    L'élement a la ligne 16 et la colonne 31
    L'élement a la ligne 16 et la colonne 34
    L'élement a la ligne 16 et la colonne 4
    L'élement a la ligne 16 et la colonne 41
    L'élement a la ligne 16 et la colonne 44
    L'élement a la ligne 17 et la colonne 1
    L'élement a la ligne 17 et la colonne 11
    L'élement a la ligne 17 et la colonne 21
    L'élement a la ligne 17 et la colonne 31
    L'élement a la ligne 17 et la colonne 41
    L'élement a la ligne 18 et la colonne 14
    L'élement a la ligne 18 et la colonne 24
    L'élement a la ligne 18 et la colonne 34
    L'élement a la ligne 18 et la colonne 4
    L'élement a la ligne 18 et la colonne 44
    L'élement a la ligne 19 et la colonne 1
    L'élement a la ligne 19 et la colonne 11
    L'élement a la ligne 19 et la colonne 14
    L'élement a la ligne 19 et la colonne 21
    L'élement a la ligne 19 et la colonne 24
    L'élement a la ligne 19 et la colonne 31
    L'élement a la ligne 19 et la colonne 34
    L'élement a la ligne 19 et la colonne 4
    L'élement a la ligne 19 et la colonne 41
    L'élement a la ligne 19 et la colonne 44
    L'élement a la ligne 20 et la colonne 1
    L'élement a la ligne 20 et la colonne 11
    L'élement a la ligne 20 et la colonne 21
    L'élement a la ligne 20 et la colonne 31
    L'élement a la ligne 20 et la colonne 41
    L'élement a la ligne 21 et la colonne 14
    L'élement a la ligne 21 et la colonne 24
    L'élement a la ligne 21 et la colonne 34
    L'élement a la ligne 21 et la colonne 4
    L'élement a la ligne 21 et la colonne 44
    L'élement a la ligne 22 et la colonne 1
    L'élement a la ligne 22 et la colonne 11
    L'élement a la ligne 22 et la colonne 14
    L'élement a la ligne 22 et la colonne 21
    L'élement a la ligne 22 et la colonne 24
    L'élement a la ligne 22 et la colonne 31
    L'élement a la ligne 22 et la colonne 34
    L'élement a la ligne 22 et la colonne 4
    L'élement a la ligne 22 et la colonne 41
    L'élement a la ligne 22 et la colonne 44
    L'élement a la ligne 23 et la colonne 1
    L'élement a la ligne 23 et la colonne 11
    L'élement a la ligne 23 et la colonne 21
    L'élement a la ligne 23 et la colonne 31
    L'élement a la ligne 23 et la colonne 41
    L'élement a la ligne 24 et la colonne 14
    L'élement a la ligne 24 et la colonne 24
    L'élement a la ligne 24 et la colonne 34
    L'élement a la ligne 24 et la colonne 4
    L'élement a la ligne 24 et la colonne 44
    L'élement a la ligne 4 et la colonne 1
    L'élement a la ligne 4 et la colonne 10
    L'élement a la ligne 4 et la colonne 13
    L'élement a la ligne 4 et la colonne 16
    L'élement a la ligne 4 et la colonne 19
    L'élement a la ligne 4 et la colonne 22
    L'élement a la ligne 4 et la colonne 25
    L'élement a la ligne 4 et la colonne 28
    L'élement a la ligne 4 et la colonne 4
    L'élement a la ligne 4 et la colonne 7


    comme vous constatez le tri marche sur une partie et non pas l'autre et pourtant tous ces élements font partie de la meme liste et j'ai implementé ma méthode compare comme suite :
    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
     
     
    import java.util.Comparator;
    import java.util.*;
    import toto.scrprocessor.JspPrinter;
     
    public class ComparatorList extends JspPrinter implements Comparator {
     
    	ComparatorList() {
     
    	}
     
    	JspPrinter tmp;
     
    	public int compare(Object arg0, Object arg1) {
    		JspPrinter p1 = (JspPrinter) arg0;
    		JspPrinter p2 = (JspPrinter) arg1;
     
    		int result = p1.getTop().compareTo(p2.getTop());
     
    		if (result == 0) { // En cas d'égalié de ligne on passe vérifier les colonnes
    			result = p1.getLeft().compareTo(p2.getLeft());
     
    		}
     
     
    		return result;
    	}
     
    }
    sachant que je tri par rapport à la ligne (TOP) en cas d'égalité je trie les colonnes.


    Merci de m'avoir aider et je compte sur vous pour m'aider à identifier d'ou vient le probleme...

    Oops je vais vous montrer encore ou j'ai fait l'appel du tri :

    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
     
     
    Collections.sort(listElements, comparator); // Trier la liste
     
    			Iterator itera = listElements.iterator();
     
    		while (itera.hasNext()) {
     
    			JspPrinter element = (JspPrinter) itera.next();
     
    			System.out.println("L'élement a la ligne " + element.getTop()
    					+ " et la colonne " + element.getLeft());
     
                    // l'affichage des valeurs des attributs ligne/colonne des objets 
     
    			currentIndex++;
     
    		}

    Merci

  8. #8
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    euh, getTop() et getLeft() te renvoie quel type de données (String, int ...) ?

  9. #9
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Il trie des chaînes à priori.

    Je crois que ton bug est dû au fait que le tri des chaînes est par défaut dans l'ordre lexicographique naturel or dans un tel ordre on a par exemple:

    1 < 10 < 2 < 20



    Tu peux pas changer le type des champs top et left en int?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Deadpool Voir le message
    Il trie des chaînes à priori.

    Je crois que ton bug est dû au fait que le tri des chaînes est par défaut dans l'ordre lexicographique naturel or dans un tel ordre on a par exemple:

    1 < 10 < 2 < 20



    Tu peux pas changer le type des champs top et left en int?

    oui une fois j'ai présenter mon probleme j'ai pu constaté aprés l'erreur


    justement j'ai changé mon code et ça marche bien maintenant Merci beaucoup

    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
     
     
    import java.util.Comparator;
    import java.util.*;
    import toto.scrprocessor.JspPrinter;
     
    public class ComparatorList extends JspPrinter implements Comparator {
     
    	ComparatorList() {
     
    	}
     
    	JspPrinter tmp;
     
    	public int compare(Object arg0, Object arg1) {
    		JspPrinter p1 = (JspPrinter) arg0;
    		JspPrinter p2 = (JspPrinter) arg1;
     
    		int valueTop1 = Integer.parseInt(p1.getTop());
    		int valueTop2 = Integer.parseInt(p2.getTop());
    		int ValueLeft1 = Integer.parseInt(p1.getLeft());
    		int ValueLeft2 = Integer.parseInt(p2.getLeft());
     
     
    		int result = new Integer(valueTop1).compareTo(new Integer(valueTop2));
     
    		if (result == 0) { // En cas d'égalié de ligne on passe vérifier les colonnes
    			result = new Integer(ValueLeft1).compareTo(new Integer(ValueLeft2));
     
    		}
     
     
    		return result;
    	}
     
    }

  11. #11
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    sinon juste en passant ...

    tu devrais gérer l'exception NumberFormatException susceptible d'être levée par le parseInt ...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 115
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par in Voir le message
    sinon juste en passant ...

    tu devrais gérer l'exception NumberFormatException susceptible d'être levée par le parseInt ...
    oui je le ferai ...Merci infiniment

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

Discussions similaires

  1. Tri multi-criteres sur une liste d'objets
    Par Rolf-IV dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 01/04/2009, 08h21
  2. Tri sur une liste d'objet
    Par Poussy-Puce dans le forum C#
    Réponses: 4
    Dernier message: 12/05/2008, 17h35
  3. Tri d'une liste d'objet CObList
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 13/07/2005, 13h50
  4. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

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