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

Java Discussion :

tri d ' une array List selon un champ


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Par défaut tri d ' une array List selon un champ
    Bonjour,
    Je cherche a trier le contenu d ' une arrayList d ' objets selon un champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private  List<Messages> messages= new ArrayList<Messages>();
    messages.add(new Messages(etat,con.recupererNumero(i).toString(),con.recupererDate(i).toString()))
    Je chercherai a la trier selon le 3 eme champs , de la date la plus récente a la plus ancienne
    J ' ai donc implemente mon propre comparateur comme ceci

    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
    	class ComparateurDates implements  Comparator<Messages>{
     
     
    		public int compare(Messages m1, Messages m2) {
    		if (m1.getDates().compareTo(m2. getDates()) == 1) {
    			return -1;
    		} else if (m1.getDates().compareTo(m2. getDates()) == -1) {
    			return 1;        	
    		} else {
    			return 0;
    		}
    	}      
     
     
    		}
    et apres j ' appelle la methode sort de Collections avec mon propre comparateur , mais le trie de n ' effectue pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void triParDates() {
    			// On trie les données :
    			Collections.sort(this.messages, new ComparateurDates());
    			// On envoi un évenement pour signaler que les données ont changées :
    			fireContentsChanged(this, 0, this.getSize());
    		}
    Je pense qu' il y a un souci avec mon algo de tri et j ' aimerais votre aide pour le résoudre svp

    Merci de votre aide

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Déjà ton comparateur est bien compliqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class ComparateurDates implements  Comparator<Messages> {
     
            public int compare(Messages m1, Messages m2) {
                    return - m1.getDates().compareTo(m2.getDates());
            }
    }

    Pour le reste, sur quoi te bases-tu pour affirmer que la liste n'est pas trié ?


    a++

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Déjà ton comparateur est bien compliqué :
    je dirais même plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class ComparateurDates implements  Comparator<Messages> {
     
            public int compare(Messages m1, Messages m2) {
                     // inverser les opérandes
                    return m2.getDates().compareTo(m1.getDates());
            }
    }

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    je dirais même plus
    Oui en effet bien vu

    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Par défaut
    salut
    Merci de ton aide

    En fait j ' essaie de remplir une Jlist avec mon arrayList triée par les dates de la plus récente a l ' ancienne
    Je pense donc qu ' il faut d ' abord trier l ' arrayList avant de remplir le modele de la Jlist avec celle ci, or les données reste non triées


    Le constructeur de mon modèle est conçu 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
     
    public class ListesPersonnalisesInterfaceMessage extends DefaultListModel{// modele de l interface message
    	/**
             * 
             */
     
    	private static final long serialVersionUID = 1L;
    	private  List<Messages> messages= new ArrayList<Messages>();// liste qui compren des messages
     
     
    	public ListesMessage(Imap con)
    	{
     
    		 boolean etat = false;
    		   for ( int i =0; i < connexionImap.nbMessage(); i++ ) {
    		          try {
    		        	  if(con.isRead(i)==true) etat=true;// si le message est lu
    		        	  else if(con.isNew(i)==false) etat=false;// si il est nouveau
    					messages.add(new Messages(etat,connexionImap.recupererNumero(i).toString(),connexionImap.recupererDate(i).toString()));
     
     
     
    				} catch (Exception e) {e.printStackTrace();}
     
     
    		            }
    		   triParDates();
    System.out.println(messages);
    		   }
    Merci encore

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Pourrais-tu afficher la liste avant/après ?

    a++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 179
    Par défaut
    Merci de ton aide et de prendre du temps pour régler mon problème.

    Voici le test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    System.out.println("liste avant tri");
    		   System.out.println(messages);
    		   System.out.println("liste apres tri");
    		   triParDates();
    		   System.out.println(messages);
    et le résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    liste avant tri
    [false +33605003049 14/09/2010 13:58:52, false +33605003049 14/09/2010 13:58:04]
    liste apres tri
    [false +33605003049 14/09/2010 13:58:52, false +33605003049 14/09/2010 13:58:04]
    Merci bien

  8. #8
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bah elle est bien triée ta List. Elle est triée de la plus récente à la plus ancienne.
    13:58:52 est plus récent que 13:58:04 donc elle est bien triée de la plus récente à la plus ancienne. Donc je ne vois pas trop le problème.

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu pourrais mettre un peu plus de données dans ta liste et dans le désordre, parce qu'un liste de 2 éléments, par définition c'est toujours trié (y a que le sens de tri qui reste indéterminé)

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

Discussions similaires

  1. [MySQL] Affichage d'une image spécifiée selon 2 champs date et date du jour
    Par tyler94 dans le forum PHP & Base de données
    Réponses: 108
    Dernier message: 03/01/2012, 09h19
  2. Réponses: 0
    Dernier message: 16/08/2010, 14h03
  3. Réponses: 5
    Dernier message: 29/01/2010, 14h22
  4. [MySQL] Tri d'une base sql selon 2 critères
    Par gandolfi dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/05/2009, 07h11
  5. MySQL : tri selon une sous-chaine d'un champ
    Par sebhm dans le forum Requêtes
    Réponses: 5
    Dernier message: 13/03/2009, 12h08

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