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 :

trier une liste


Sujet :

Langage Java

  1. #1
    Membre expérimenté Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Par défaut trier une liste
    Bonjour,

    J'ai un code qui me semble logique et bon mais je n'ai pas le résultat escompté.

    Je souhaite que mon vecteur soit trié par l'ordre naturel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     Collection setTable = new Vector();
     Map mapTable = new TreeMap();
     
    ...
     
    mapTable.put(item, table);
     
    ...
     
    setTable.addAll(mapTable.entrySet());
    Collections.sort((List<T>) setTable);
    bien entendu ma liste n'est pas trié. je pense d'ailleur que je n'ai pas besoin du Collections.sort() car de base un Vector trie dans l'ordre naturel non ?

  2. #2
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Bonjour.

    Non, un Vector ne trie pas naturellement.
    Tu as deux possibilités pour trier :
    - Tu utilises une liste classique et tu fait une Collections.sort (ce que tu as fait)
    - Tu utilises un SortedSet qui trie les éléments 'en live'

    Dans les deux cas, pour que le tri soit effectif, tes structures doivent savoir comment trier tes éléments. Là encore, deux solutions:
    - Les éléments implémentent Comparable
    - Tu files un Comparator (à l'initialisation du SortedSet ou lors de l'appel à Collections.sort)

  3. #3
    Membre expérimenté Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Par défaut
    Pourquoi n'est-il pas possible de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MyComparator compareTo = new MyComparator();
    Collection setTable = new TreeSet(compareTo);
    Map mapTable = new TreeMap();
    ...
    mapTable.put(item, table);
    ...
    setTable.addAll(mapTable.entrySet());
    Mon TreeSet reste vide..

  4. #4
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Ce bout de code a l'air correct.
    Es-tu sûr que ta table n'est pas vide au moment où tu remplis ton TreeSet?

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 592
    Par défaut
    Note au passage que quand tu appelles mapTable.entrySet(), ça te renvoie une collection (triée) d'objets Map.Entry.

    Es-tu certain que ton comparateur sait comparer des Map.Entry ?

    (Et est-ce que par hasard tu ne ferais pas une gestion d'exceptions un peu sauvage dans le cas où il ne sache pas comparer ça ?)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre expérimenté Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Par défaut
    Je ne suis pas certain que mon comparateur sache le faire, j'peux vous fournir le code de mon comparateur s'il faut.

    Donc en fait, dans mon TreeSet ou même dans un veteur je dois obtenir la collection déjà trié par la map ?

  7. #7
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    En fait, l'idéal serait que tu utilises les generics et que tu types tes structures de données et ton comparateur. Rien qu'en faisant ça, je pense que tu verras fleurir quelques erreurs et/ou warnings.

  8. #8
    Membre expérimenté Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Par défaut
    Voici mon comparateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     class MyComparator implements Comparator<String> {
     
            public int compare(String a, String b) {
                String aStr, bStr;
     
                aStr = a;
                bStr = b;
     
                return bStr.compareTo(aStr);
            }
        }
    Pour la gestion des exceptions je me contente de mettre la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setTable.addAll(mapTable.entrySet());
    dans un bloc try catch. Je récupère la première occurrence dans le TreeSet puis une exception est levée :
    java.lang.ClassCastException: java.util.TreeMap$Entry
    Autant dire que cela ne me sert pas beaucoup.

    Deaf, je suis en quelque sorte un gros newbie en développement JAVA et je ne comprend pas bien ton conseil :/

    Edit : D'après ce que j'ai pu lire sur le net à propos de TreeMap, il est censé trié dans l'ordre croissant, conformément à l'ordre naturel des clés si aucun comparateur ne lui est fourni en paramètre. Donc en fait, je devrais avoir la map déjà triée et il ne me resterai plus qu'a la mettre dans un Vector par exemple. Comment expliquez vous qu'elle ne soit pas triée ?

    Edit2: Dans une autre partie de ma servlet j'utilise une autre Map presque similaire (clefs=JSON, valeur=String). Et bien de base je retrouve bien la map triée dans l'ordre naturel..

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 592
    Par défaut
    Citation Envoyé par JulienFio Voir le message
    Voici mon comparateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     class MyComparator implements Comparator<String> {
     
            public int compare(String a, String b) {
                String aStr, bStr;
     
                aStr = a;
                bStr = b;
     
                return bStr.compareTo(aStr);
            }
        }
    Oui ben ça, ça compare des String, pas des Map.Entry.
    Quand tu fais setTable.addAll(mapTable.entrySet()); : entrySet() renvoie une collection triée de Map.Entry. addAll essaie de tous les ajouter à la collection setTable. Mais c'est un TreeSet, qui utilise le comparator compareTo. Et ce comparator compare des String. Le programme essaie donc de caster tes Map.Entry en String, ce qui génère un ClassCastException.

    Citation Envoyé par JulienFio Voir le message
    Pour la gestion des exceptions je me contente de mettre la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setTable.addAll(mapTable.entrySet());
    dans un bloc try catch. Je récupère la première occurrence dans le TreeSet puis une exception est levée :
    C'est l'exception dont j'ai parlé avant. Vu que l'exception est levée dès qu'il y a besoin d'appeler Comparator, et qu'il y a besoin de le faire dès qu'on doit comparer un deuxième élément au premier inséré, ceci explique cela.

    Citation Envoyé par JulienFio Voir le message
    Edit : D'après ce que j'ai pu lire sur le net à propos de TreeMap, il est censé trié dans l'ordre croissant, conformément à l'ordre naturel des clés si aucun comparateur ne lui est fourni en paramètre. Donc en fait, je devrais avoir la map déjà triée et il ne me resterai plus qu'a la mettre dans un Vector par exemple.
    Oui. Mais comprenons bien que seuls les objets qui implémentent Comparable ont un ordre naturel. Les autres ne peuvent pas être insérés dans un TreeMap qui n'a pas de Comparator, cela lèverait une exception.

    Citation Envoyé par JulienFio Voir le message
    Comment expliquez vous qu'elle ne soit pas triée ?
    Si tes objets implémentent Comparable, elle l'est. Vérifie.
    Si tes objets n'implémentent pas Comparable, ta TreeMap n'est pas triée parce qu'elle ne contient qu'un élément et que les autres n'ont pas pu être insérés.

    Citation Envoyé par JulienFio Voir le message
    Edit2: Dans une autre partie de ma servlet j'utilise une autre Map presque similaire (clefs=JSON, valeur=String). Et bien de base je retrouve bien la map triée dans l'ordre naturel..
    J'ignorais que le JSON avait un ordre naturel... Mais si c'est le cas, c'est normal avec une TreeMap.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre expérimenté Avatar de JulienFio
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 201
    Par défaut
    Bon ça marche, en fait j'ai inversé ma TreeMap (clef:String; valeur:JSON).

    Merci beaucoup pour vos explications qui m'ont permis de bien comprendre le fonctionnement de ces collections.

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

Discussions similaires

  1. Trier une liste chainée.
    Par gregb34 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 21/05/2006, 22h05
  2. Trier une liste de dossiers et de fichiers
    Par steveleg dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2006, 16h54
  3. trier une list
    Par elekis dans le forum C++
    Réponses: 4
    Dernier message: 23/03/2006, 12h01
  4. [c#] Trier une liste de nombres liés.
    Par Joad dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/05/2005, 11h17
  5. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44

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