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 :

Comparator et trie alphabetique


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut Comparator et trie alphabetique
    Bonjour,

    je cherche a trier alphabetiquement une liste de fichier en utilisant bien evidemment leurs noms.

    J'utilise la classe Comparator avec un code specifique pour qu'au final la liste soit trier de telle facon que les dossiers soient reorganises alphabetiquement mais situe en premier dans la liste puis ensuite les fichiers.

    Les dossiers sont biens tries mais quand on en vient au fichier, il y a un groupe de 4/5 fichiers dans la liste qui se retrouve trier mais en dernier dans la liste.

    J'ai essaye un simple compararTo uniquement sur la liste des fichiers et j'obtiens le meme reordering donc ce n'est apparemment ma methode qui distingue fichier ou dossier qui pose probleme lorsque je les trie.

    En revanche, si je fais un Collections.sort(Liste), la les fichiers sont bien reorganises alphabetiquement.....

    Donc le probleme vient bien du comparator mais c est bizarre car les nombreux exemple que j ai pu voir pour comparer des strings implementait uniquement un return string1.compareTo(string2)

    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 NameComparator implements Comparator, Serializable{
                public int compare(Object fileName1, Object fileName2){
     
                    int response=0;
                    File file1 = (File)fileName1;
                    File file2 = (File)fileName2;
     
                    String name1 = file1.getName();
                    String name2 = file2.getName();
     
                    if(name1.equals("Parent Directory")) response = 1;
                    else if(name2.equals("Parent Directory")) response = -1;
     
                    else if(file1.isDirectory() && file2.isFile()) response = -1;
                    else if(file2.isDirectory() && file1.isFile()) response = 1;
     
                    else if(file1.isDirectory() && file2.isDirectory()) {
                        if(name1.compareTo(name2) > 0) response = 1;
     
                    }
                    else if(file1.isFile() && file2.isFile()) {
                        if(name1.compareTo(name2) > 0) response = 1;   
                    }
                    if(name1.compareTo(name2) > 0) response = 1;
                    else response =-1;
                   //System.out.println(name1 + " comparedTo " + name2 + " : " + String.valueOf(response));
                return response;
     
                }
    Merci pour votre aide et bonne journee,

    Antoine.

  2. #2
    Membre actif
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Points : 276
    Points
    276
    Par défaut
    Salut,

    Tout d'abord on code n'est pas très lisible :s, cet enchainement de else if sans indentation ne facilite pas la comprehension :/, y a t il une raison au fait que tu ne casse pas ta fonction avec plusieurs returns à des endroits strategiques ?

    Quand à ton probleme (à ce que j'ai pu comprendre a ton code apres l avoir indenté), il semblerait que la derniere comparaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    			if(name1.compareTo(name2) > 0) 
    				response = 1;
    			else 
    				response =-1;
    			//System.out.println(name1 + " comparedTo " + name2 + " : " + String.valueOf(response));
    			return response;
    prenne totalement la main sur toutes les comparaisons effectuées auparavant : Peu importe ce que tu as fait avant, la fonction va passer dans cette boucle apres l enchainement de else if et ecraser les resultats precedants.

    Je te conseille fortement de return un resultat des que tu es sur d'en avoir un au lieu de poursuivre la fonction dans un else.

    a+
    Non, Vahid n'est pas mon prénom
    c' est gratuit , aussi

  3. #3
    Membre averti Avatar de aJavaDeveloper
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 248
    Points : 300
    Points
    300
    Par défaut
    Tout d'abord ton code n'est pas très lisible :s, cet enchainement de else if sans indentation ne facilite pas la comprehension :/
    Là je dois dire que je ne suis pas du tout d'accord avec toi : sa mise en forme des else if permet de rendre son code plus compact et plus lisible.
    y a t il une raison au fait que tu ne casse pas ta fonction avec plusieurs returns à des endroits strategiques ?
    Pourquoi casserait-il sa fonction avec des return puisqu'il fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ... 
    else if ... 
    else if ... 
    else if ...
    ...
    Il n'y aura jamais qu'un seul cas qui sera vérifié (grâce aux else).
    il semblerait que la derniere comparaison prenne totalement la main sur toutes les comparaisons effectuées auparavant
    C'est tout à fait correcte : je pense que ceres02 a oublié le else avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(name1.compareTo(name2) > 0)
    Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie.
    Confucius

  4. #4
    Membre actif
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Points : 276
    Points
    276
    Par défaut
    Là je dois dire que je ne suis pas du tout d'accord avec toi : sa mise en forme des else if permet de rendre son code plus compact et plus lisible.
    Pourquoi casserait-il sa fonction avec des return puisqu'il fait
    Question d'habitude, personnellement je pense qu'a la place d'un else/if/affectation, un if/return est plus adapté.

    Question d'habitude, comme je dis, et ca aurait éviter l'écrasement de la dernière comparaison

    enfin bon on va pas se battre pr ca
    Non, Vahid n'est pas mon prénom
    c' est gratuit , aussi

  5. #5
    Membre averti Avatar de aJavaDeveloper
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 248
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par vahid
    Question d'habitude, personnellement je pense qu'a la place d'un else/if/affectation, un if/return est plus adapté.
    C'est vrai que, pour ma part, j'ai également plus tendance à utiliser le if/return.
    Toutefois, j'ai déjà entendu dire (peut être à tort) qu'une procédure avec plusieurs points de sortie (= plusieurs return) est un anti-pattern.

    Citation Envoyé par vahid
    Question d'habitude, comme je dis, et ca aurait éviter l'écrasement de la dernière comparaison
    C'est vrai...

    Citation Envoyé par vahid
    enfin bon on va pas se battre pr ca
    Evidemment que non .
    Mais une discussion impliquant des points de vue contraires est toujours enrichissantes.
    Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie.
    Confucius

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    je suis desole pour la reponse tardive mais comme je ne voyais pas de reponses les premiers jours, j'ai cru que c etait peine perdue =)

    Pour ce qui est de l ecriture du code... j'ai tendance a fonctionner comme aJavaDeveloper, c est a dire faire un code compact.

    Si j ai plusieurs lignes a rentrer dans un if, les accolades sont les biens venus mais si j en ai qu'une, je sais que pour cette condition, je trouve a cote l action et en plus j ai pas 15.000 lignes de codes avec des {}.

    Maintenant pour ce qui est de mon probleme, j avais perdu tout espoir et vos reponses m'ont relance. J'ai effectivement oublie un else la ou vous l avez mentionne. Mais ce n est pas la ou le probleme se situait.

    Il faut utilise des equals compareToIgnoreCase() et non pas des compare(), tout simplement. Ca marche parfaitement et je vous remercie quand meme pour les suggestions car sans vous je m y serai pas replonge =).

    Ainsi, voici le code en question pour ceux que ca interesse, grandement simplifie et beaucoup plus clair:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class NameComparator implements Comparator, Serializable{  
             public int compare(Object f1, Object f2){  
                 FileSystemViewer fsv = FileSystemViewer.getFileSystemView();
                 File file1 = (File)f1;
                 File file2 = (File)f2;
                 boolean dirF1 = file1.isDirectory();
                 boolean dirF2 = file2.isDirectory();
     
                 if(dirF1 && !dirF2) return -1; 
                 else if(dirF2 && !dirF1) return 1; 
                 else return fsv.getSystemDisplayName(file1).compareToIgnoreCase(fsv.getSystemDisplayName(file2));            
             }
         }

  7. #7
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Je rebondis sur les remarques .

    Perso ( et ce n'est que mon avis) on m'a toujours appris à limiter au maximum au maximum les points de rertours.

    Un return par fonction/méthode c'est la régle.
    Sinon ca veut dire que votre code est mal organisé et que vous êtes obligé de tout modifier pour modifier la sortie.

    ( Genre vous retournez un int , et ca devient un float, il faut tout recaster. )
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

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

Discussions similaires

  1. Ordre des colonnes non triée alphabetiquement
    Par mouss4rs dans le forum JPA
    Réponses: 4
    Dernier message: 30/05/2008, 16h51
  2. [date] Comparer deux formats différents
    Par terziann dans le forum Requêtes
    Réponses: 17
    Dernier message: 21/07/2003, 15h21
  3. [LG][FAQ]comparer des fichiers
    Par lucke dans le forum Langage
    Réponses: 11
    Dernier message: 01/06/2003, 18h02
  4. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  5. Comparer des fichiers de données : Quel Langage ?
    Par Anonymous dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 24/04/2002, 22h37

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