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 dans une ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 54
    Points
    54
    Par défaut trier une liste d'objets dans une ArrayList
    Bonsoir,
    Voila, je veux trier une liste d'objets Personne , j'ai donc chercher sur le net
    et je n'arrive pas à avoir ma liste triés.
    Voic mon 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
    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
    public static void main(String[] args) {
    	liste1.add(new Personne (1,"dupont","jean"));
    	liste1.add(new Personne (5,"martin","joseph"));
    	liste1.add(new Personne (4,"martinet","alain"));
    	liste1.add(new Personne (3,"andre","gilles"));
    	liste1.add(new Personne (5,"Zachari","philippe"));
     
    	Collections.sort(liste1);
    	for (Iterator iter = liste1.iterator(); iter.hasNext();) {
    	    Personne p   = (Personne) iter.next();
    	    System.out.println("id = " + p.getId() + " nom = " + p.getNom() + " prenom = " + p.getPrenom());
    	} 
     
    } 
    ...............
    public class Personne  implements Comparable {
    private long id=0;
    private String nom=null;
    private String prenom=null;
     
     
    public Personne(long id, String nom, String prenom) {
    	super();
    	this.id = id;
    	this.nom = nom;
    	this.prenom = prenom;
    }
    /**
     * @return the id
     */
    public long getId() {
    	return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(long id) {
    	this.id = id;
    }
    /**
     * @return the nom
     */
    public String getNom() {
    	return nom;
    }
    /**
     * @param nom the nom to set
     */
    public void setNom(String nom) {
    	this.nom = nom;
    }
    /**
     * @return the prenom
     */
    public String getPrenom() {
    	return prenom;
    }
    /**
     * @param prenom the prenom to set
     */
    public void setPrenom(String prenom) {
    	this.prenom = prenom;
    }
    /**
     * CompareTo : Permet de trier par nom prénom 
     */
    public int compareTo(Object o) // on redéfinit compareTo(Object)
    {
      Personne p=(Personne)o;
      if(nom.equals(p.nom))
      {    
        return prenom.compareTo(p.prenom);
      }
     return nom.compareTo(p.nom);
    }
     
    }
    Et ça donne cela :
    id = 5 nom = Zachari prenom = philippe
    id = 3 nom = andre prenom = gilles
    id = 1 nom = dupont prenom = jean
    id = 5 nom = martin prenom = joseph
    id = 4 nom = martinet prenom = alain


    Pourtant je l'ai au boulot sur des objets plus complexes et ça fonctionne !!


    D'abord quelqu'un peut-il me dépanner et ensuite me dire comment on fait pour avoir un second critère de tri pour cette liste (par exemple tri sur prénom, nom)
    Merci bcp

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    Je n'ai rien dit , mon tri se passe bien , je n'avais pas vu la majuscule sur "Zachari"

    Ma question reste toujours si je veux trier cette même liste avec d'autres critères

    De plus je n'arrive pas bien à comprendre comment ça fonctionne en général.
    Comment java sait-il qu'il s'agit d'une liste d'objet "Personne" car j'aurais très bien mettre dans cette liste une liste d'objet "véhicules" par exemple?

  3. #3
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Salut,
    Il faut utiliser l'autre variante de Collections.?sort qui prend en plus de la liste un java.util.Comparator.

    Il te faut donc implémenter un Comparator<Person> qui compare 2 personnes selon les critères qui te veux.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    Merci mais peux tu me donner quelques précisions par rapport à mon exemple

    avec un tri par nom/ prénom
    et un tri par prenom/nom

    J'ai bien cherché sur le net mais j'avoue que je ne comprends pas très bien
    Comment écrire les 2 méthodes dans ma classe Personne ?
    Comment appeler chacun des tris avec Collection.sort

    Merci

  5. #5
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    Bonjour,
    Oui j'avais bien vu cette faq, mais j'ai du mal à mettre en application. Je suis débutante,je commence à maitriser les Arraylist et les manipulations d'objet.
    Peu de formation et des délais trop court qui empêchent l'approfondissement d'ou une utilisation de ce qui a été fait dans d'autres applications sans trop chercher à comprendre du moment que ça marche !
    D'ou bon nombre de recherche sur son temps perso !

    Donc si j'ai bien compris , il faut utiliser des map et non des arraylist pour trier ? ce qye je ne vois pas trop bien comment le mettre en place
    Il faudrait aussi en plus de la classe Personne créer autant de classe "PersonneComparator implements Comparator<Long>{" ?

    Le problème dans mon application (pas l'exemple que j'ai donné), on utilise des Arraylist (en fait ce sont le résultat de requêtes hibernate), ensuite j'effectue une traitement sur ces listes et c'est après que je dois les trier et selon le cas les critères de tri sont différents. Jusquà maintenant ça marche car je n'ai qu'un critère de tri par type d'objet mais là on me demande de trier une liste d'objets de plusieurs façon selon le cas.


    Merci à tous

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


    Non tu n'as pas à utiliser de Map ! djo.mos te donnait ce lien pour avoir plus d'info sur les Comparator !


    Désolé de te l'annoncer, mais ton code fonctionne parfaitement !

    Eh oui tu demandes un tri par nom et c'est bien ce que tu obtiens. Dans Unicode les caractères en majuscule sont bien devant les caractères en minuscules...


    Si tu veux éviter cela tu peux faire une comparaison en "ignore case" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	/**
             * CompareTo : Permet de trier par nom prénom (ignore case)
             */
    	public int compareTo(Object o) // on redéfinit compareTo(Object)
    	{
    		Personne p = (Personne) o;
    		int result = nom.compareToIgnoreCase(p.nom);
    		if (result==0) {
    			result = prenom.compareToIgnoreCase(p.prenom);
    		}
    		return result;
    	}

    Maintenant cela peut encore poser des problèmes, car cela reste un tri selon le code Unicode et que tu peux avoir des incohérences. Par exemple tous les caractères accentuées se retrouveront à la fin. Ainsi "andré" se retrouvera après "andru"...

    Pour éviter cela il faut utiliser un Collator qui permet de respecter les règles d'une langue. Par exemple en français les caractères accentué viennent juste après leurs équivalents sans accent, les majusucles viennent après leurs équivalents en minuscule, ...)

    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
    	private final Collator collator = Collator.getInstance(Locale.FRENCH);
     
    	/**
             * CompareTo : Permet de trier par nom prénom (selon les règles de français)
             */
    	public int compareTo(Object o) // on redéfinit compareTo(Object)
    	{
    		Personne p = (Personne) o;
    		int result = collator.compare(nom, p.nom);
    		if (result==0) {
    			result = collator.compare(prenom, p.prenom);
    		}
    		return result;
    	}
    Plus d'info Comment comparer des chaînes de caractères selon la Locale ?

    a++

  8. #8
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Citation Envoyé par sandrine49 Voir le message
    on me demande de trier une liste d'objets de plusieurs façon selon le cas
    Salut bien,

    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
    123
    124
    125
    126
    import java.text.Collator;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Locale;
     
    public class Test {
     
    	private static Collator COLLATOR = Collator.getInstance(Locale.FRENCH);
     
    	private List<Personne> liste1 = new ArrayList<Personne>();
     
    	public static void main(String[] args) {
    		new Test();
    	}
     
    	public Test() {
    		this.liste1.add(new Personne(6, "Naimare", "jean"));
    		this.liste1.add(new Personne(2, "martin", "anne"));
    		this.liste1.add(new Personne(4, "martinet", "alain"));
    		this.liste1.add(new Personne(3, "andre", "gilles"));
    		this.liste1.add(new Personne(5, "Zachari", "philippe"));
    		this.liste1.add(new Personne(1, "dupont", "jean"));
    		this.liste1.add(new Personne(5, "martin", "jean"));
     
    		Collections.sort(this.liste1, new PersonneComparator(CompareType.NOM));
     
    		System.out.println("Par nom");
    		System.out.println("-------");
    		for (Personne p : this.liste1) {
    			System.out.print("{");
    			System.out.printf("%10s", p.getNom());
    			System.out.print(", ");
    			System.out.printf("%10s", p.getPrenom());
    			System.out.println(" }");
    		}
     
    		Collections.sort(this.liste1, new PersonneComparator(CompareType.PRENOM));
     
    		System.out.println("\nPar prénom");
    		System.out.println("-----------");
    		for (Personne p : this.liste1) {
    			System.out.print("{");
    			System.out.printf("%10s", p.getPrenom());
    			System.out.print(", ");
    			System.out.printf("%10s", p.getNom());
    			System.out.println(" }");
    		}
    	}
     
    	public class Personne {
    		private long id = 0;
    		private String nom = null;
    		private String prenom = null;
     
    		public Personne(long id, String nom, String prenom) {
    			super();
    			this.id = id;
    			this.nom = nom;
    			this.prenom = prenom;
    		}
     
    		public long getId() {
    			return this.id;
    		}
     
    		public void setId(long id) {
    			this.id = id;
    		}
     
    		public String getNom() {
    			return this.nom;
    		}
     
    		public void setNom(String nom) {
    			this.nom = nom;
    		}
     
    		public String getPrenom() {
    			return this.prenom;
    		}
     
    		public void setPrenom(String prenom) {
    			this.prenom = prenom;
    		}
     
    	}
     
     
    	public class PersonneComparator implements Comparator<Personne> {
     
    		private CompareType type;
     
    		public PersonneComparator(CompareType t) {
    			this.type = t;
    		}
     
    		@Override
    		public int compare(Personne p1, Personne p2) {
    			if (this.type == CompareType.NOM) {
    				int c = COLLATOR.compare(p1.getNom(), p2.getNom());
    				if (c == 0) {
    					return COLLATOR.compare(p1.getPrenom(), p2.getPrenom());
    				} else {
    					return c;
    				}
    			} else {
    				int c = COLLATOR.compare(p1.getPrenom(), p2.getPrenom());
    				if (c == 0) {
    					return COLLATOR.compare(p1.getNom(), p2.getNom());
    				} else {
    					return c;
    				}
    			}
     
    		}
     
    	}
     
    	public enum CompareType {
    		NOM,
    		PRENOM;
    	}
     
    }

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    Bonjour à tous

    visiwi, ça fonctionne impeccable.
    Comme je souahitais n'avoir que la classe Personne et la classe Test (les 2 à part), je l'ai réécrit comme ceci :
    Classe Personne :
    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
    import java.util.Comparator;
     
    	public class Personne  {
    		private long id = 0;
    		private String nom = null;
    		private String prenom = null;
     
    		public Personne(long id, String nom, String prenom) {
    			super();
    			this.id = id;
    			this.nom = nom;
    			this.prenom = prenom;
    		}
     
    		public long getId() {
    			return this.id;
    		}
     
    		public void setId(long id) {
    			this.id = id;
    		}
     
    		public String getNom() {
    			return this.nom;
    		}
     
    		public void setNom(String nom) {
    			this.nom = nom;
    		}
     
    		public String getPrenom() {
    			return this.prenom;
    		}
     
    		public void setPrenom(String prenom) {
    			this.prenom = prenom;
    		}
     
     
    		public static final Comparator<Personne> ID_COMPARATOR = new Comparator<Personne>() {
     
     
    			@Override
    			public int compare(Personne arg0, Personne arg1) {
    				// TODO Auto-generated method stub
    				Personne p=(Personne) arg0;
    				Personne q=(Personne) arg1;
    				  if(p.id == q.id)
    				  {    
    					  return p.prenom.compareTo(q.prenom);
    				  }  else if (p.id > q.id)  return 1;
    				  else return -1;				
    			}
     
    	    };
     
    	    public static final Comparator NOM_COMPARATOR = new Comparator<Personne>() {
     
    			@Override
    			public int compare(Personne arg0, Personne arg1) {
    				Personne p=(Personne) arg0;
    				Personne q=(Personne) arg1;
    				  if(p.getNom() == q.getNom())
    				  {    
    					  return p.prenom.compareTo(q.prenom);
    				  }  else return p.nom.compareTo(q.nom);
    				  		}	 
    	    };
     
    	}
    classe test:
    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
     
     
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Iterator;
     
    public class Test {
     
     
    	private ArrayList liste1 = new ArrayList();
     
    	public static void main(String[] args) {
    		new Test();
    	}
     
    	public Test() {
    		this.liste1.add(new Personne(6, "Naimare", "jean"));
    		this.liste1.add(new Personne(2, "martin", "anne"));
    		this.liste1.add(new Personne(4, "martinet", "alain"));
    		this.liste1.add(new Personne(3, "andre", "gilles"));
    		this.liste1.add(new Personne(5, "Zachari", "philippe"));
    		this.liste1.add(new Personne(1, "dupont", "jean"));
    		this.liste1.add(new Personne(5, "martin", "jean"));
     
    		//Collections.sort(this.liste1);
    		Collections.sort(this.liste1, Personne.ID_COMPARATOR);		
     
    		System.out.println("Par id");
    		System.out.println("-------");
    		for (Iterator iter = liste1.iterator(); iter.hasNext();) {
    		    Personne p   = (Personne) iter.next();
    		    System.out.println("id = " + p.getId() + " nom = " + p.getNom() + " prenom = " + p.getPrenom());	
     
    	}
    		Collections.sort(this.liste1, Personne.NOM_COMPARATOR);	
    		System.out.println("Parnom");
    		System.out.println("-------");
    		for (Iterator iter = liste1.iterator(); iter.hasNext();) {
    		    Personne p   = (Personne) iter.next();
    		    System.out.println("id = " + p.getId() + " nom = " + p.getNom() + " prenom = " + p.getPrenom());	
     
    	}
    	}
     
    }
    Bien sûr il me reste à l'améliorer et à comprendre vraiment comment ça fonctionne
    En tout cas merci

  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
    J'ai ecrit le même type de méthode pour trier liste d'objet de plusieurs façon selon le besoin et ça fonctionne effectivement.

    Par contre comme mes connaissances en java sont basiques, j'aimerais avec une explication concernant ta méthode "public static final Comparator<Personne> ID_COMPARATOR = new Comparator<Personne>() {..." de ta classe Personne. par exemple ce ";" à la fin m'intrigue.

    Merci à tous de vos explications.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/02/2010, 14h05
  2. Réponses: 10
    Dernier message: 07/01/2010, 13h53
  3. Chercher un objet dans une liste d'objet
    Par Axiome dans le forum Windows Forms
    Réponses: 5
    Dernier message: 10/10/2008, 09h43
  4. Réponses: 2
    Dernier message: 29/05/2008, 15h59
  5. Savoir si un objet d'une certaine classe est dans une liste
    Par Denti-fritz dans le forum Langage
    Réponses: 3
    Dernier message: 26/04/2007, 09h05

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