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 avec Collections.sort(liste)


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 72
    Par défaut Trier une liste avec Collections.sort(liste)
    Bonjour à tous,

    voilà j'ai un problème de trie et je galère avec depuis deux jours déjà, je vous explique:

    j'ai une liste d'objet définie comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     List<ConfigCTO> liste = new ArrayList<ConfigCTO>();
    et que j'alimente avec un result set (le résultat de ma requete), puis je fais le trie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     SqlQuery requete = null;
    		try {
    			requete = new SqlQuery(config.getString("jndiMes"), sqlTouteLaListeAServir);			
    			final ResultSet rs = requete.getResults();
    			while (rs.next())
    			{
    				ConfigCTO cto = new ConfigCTO(rs.getString("PN"), rs.getString("IDECLIENT"), rs.getString("CONFIGCODE"), rs.getString("NUMCONFIG"), rs.getInt("QTE_USED"), rs.getString("DATEXPED"));
     
    				liste.add(cto);					
    			}
     
    			//trie de la liste
    			 Collections.sort(liste);
    dans ma classe ConfigCTO , j'ai définie la ma méthode compareTo comme suit pour faire le trie par date, client et configCode :
    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
     
    //trie par date, client et parnumConfig
    	public int compareTo(Object other) {
    		// TODO Auto-generated method stub
    		String date1 = ((ConfigCTO) other).getDateExpe(); 
    		String client1 = ((ConfigCTO) other).getClient();
    		String configcode1 = ((ConfigCTO) other).getConfigcod(); 
     
    		String date2 = this.getDateExpe(); 
    		String client2 = this.getClient(); 
    		String configcode2 = this.getConfigcod(); 
     
    		int dateCmp = date2.compareTo(date1);
            if (dateCmp != 0) 
                return dateCmp;
     
            int clientCmp = client2.compareTo(client1);
            if (clientCmp != 0)
            	return clientCmp ;
     
            int configcodeCmp = configcode2.compareTo(configcode1);
            if (configcodeCmp != 0)
            	return configcodeCmp ;
            else 
            	return 1;        
    	} 
     
    }
    le problème c'est que le trie de ma liste n'est pas bonne à la sortie, j'ai essayé plein de truc en cherchant sur le net, mais jusque là j'arrive toujours pas à trier ma liste.

    quelqu'un aurait-il une idée de ce que j'ai peut être loupé? ou ce n'est simplement pas possible de trier les objets dans une liste sur plusieurs attributs?

    vos aides seront les bien venus, parce que là je ne sais vraiment pas quoi faire

    je vous remercie de votre aide par avance.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Eh bien le return 1; à la fin est quand même assez malheureux. Les 5 dernières lignes devraient être simplement remplacées par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return configcode2.compareTo(configcode1);

    Mais en fait je me demande si tu as bien pensé à mettre implements Comparable<ConfigCTO> à ta class ConfigCTO.
    Et si oui, comment tu peux avoir une méthode public int compareTo(Object other) et non pas public int compareTo(ConfigCTO other).

    Citation Envoyé par nakry Voir le message
    ou ce n'est simplement pas possible de trier les objets dans une liste sur plusieurs attributs?
    Ben si, ça marche pareil que sur un seul -_-°.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 72
    Par défaut
    Oui ma classe ConfigCTO implements Comparable au lieu de Comparable<ConfigCTO> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class ConfigCTO  extends Entity implements java.lang.Comparable, Serializable { .....}
    c'est pourquoi ma méthode compareTo est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int compareTo(Objet other)
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int compareTo(ConfigCTO other)
    et dedans j'ai fais le cast de objet en ConfigCTO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String date1 = ((ConfigCTO) other).getDateExpe(); 
    		String client1 = ((ConfigCTO) other).getClient();
    		String configcode1 = ((ConfigCTO) other).getConfigcod();
    effectivement c'est plus simple de faire comme tu l'as dit, je vais essayé ta solution et je te dis ça

    merci beaucoup !!!

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 72
    Par défaut
    ça ne marche toujours pas
    la liste n'est toujours pas triée, ma classe est bien ainsi
    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
     
    public class ConfigCTO  extends Entity implements Comparable<ConfigCTO> , Serializable {
     .....
     .......
    	//trie par date, client et parnumConfig
    	public int compareTo(ConfigCTO other) {
    		// TODO Auto-generated method stub
    		String date1 = ((ConfigCTO) other).getDateExpe(); 
    		String client1 = ((ConfigCTO) other).getClient();
    		String configcode1 = ((ConfigCTO) other).getConfigcod(); 
     
    		String date2 = this.getDateExpe(); 
    		String client2 = this.getClient(); 
    		String configcode2 = this.getConfigcod(); 
     
    		int dateCmp = date2.compareTo(date1);
                    if (dateCmp != 0) 
                         return dateCmp;
     
                   int clientCmp = client2.compareTo(client1);
                   if (clientCmp != 0)
            	     return clientCmp ;
     
                  return configcode2.compareTo(configcode1); 
    	}
     
    }
    et ma liste traitée ainsi
    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
     
    public ListeAservir ()
    	{		
    		List<ConfigCTO> liste = new ArrayList<ConfigCTO>();
    		SqlQuery requete = null;
    		try {
    			requete = new SqlQuery(config.getString("jndiMes"), sqlTouteLaListeAServir);			
    			final ResultSet rs = requete.getResults();
    			while (rs.next())
    			{	
    				ConfigCTO cto = new ConfigCTO(rs.getString("PN"), rs.getString("IDECLIENT"), rs.getString("CONFIGCODE"), rs.getString("NUMCONFIG"), rs.getInt("QTE_USED"), rs.getString("DATEXPED"));
     
    				liste.add(cto);					
    			}
     
    			//trie de la liste
    			 Collections.sort(liste);  			
     
    			int i = 0 ;			 
    			for (ConfigCTO cto: liste){
    				i++;				
    				donnee.put(i, cto);
    			}
     
    		} catch (Exception ex) {
    			log.error(ex);
    		} finally {
    			if (requete != null)
    				requete.closeConnexion();
    		}
    	}
    il y aurait-il une autre erreur?

    merci d'avance

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 72
    Par défaut
    j'ai l'impression que le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(liste)
    ne compare pas un élément de la liste à tous les autres éléments de la liste avant de le classer, mais plutot il ne le compare qu'avec l'élément qui le suit, est-ce comme cela que fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(liste)
    pour comparer les objets contenus dans une liste?


    aidez moi SVP!!!

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Il ne les compare pas tous, mais il fait autant de comparaisons que nécessaire pour que la liste soit entièrement et correctement triée.

    Pour l'instant je ne vois pas ce qui ne va pas. Je pense que soit tu te trompes en disant que les données ne sont pas triées après Collections.sort(), soit ta décision d'utiliser compareTo() entre Strings ne produit pas le tri dont tu as besoin (et que tu aurais pu t'en rendre compte tout seul.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. classer une liste avec dates en liste avec périodes
    Par concombre_masqué dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 21/02/2010, 09h37
  2. Tri d'une zone de liste avec origine source : liste valeurs?
    Par electrosat03 dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/05/2009, 21h01
  3. rafraichir une view avec invalid display list
    Par john123 dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 03/02/2009, 23h47
  4. ajout d'une description pour des fichiers listes avec apache
    Par deny dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 31/10/2007, 10h16

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