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 :

Problème de tri avec compartTo


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Problème de tri avec compartTo
    Bonjour,

    J'ai un petit souci de comparaison de String. En effet, j'essaie de trier un vecteur avant l'affichage des informations contenues par celui-ci. Je vous met le bout de code correspondant afin d'imaginer un peu ce que je désire faire.

    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
     
     
        private class TrieurECO extends SortEngine
        {
            public boolean compareElements(int firstElementIndex, int secondElementIndex)
            {
                ArticleInfos serialInfos1 = (ArticleInfos)GetVector().elementAt(firstElementIndex);
                String chaine1 = serialInfos1.ECO;
                ArticleInfos serialInfos2 = (ArticleInfos)GetVector().elementAt(secondElementIndex);
                String chaine2 = serialInfos2.ECO;
                return (chaine2.compareTo(chaine1)<0);
            }
     
            private TrieurECO(Vector v) 
            {
                super(v);
            }                
        }

    La fonction de tri, en elle même, s'exécute mais pas exactement comme je le voudrais.

    En effet, dans les strings que je veux trier, certains correspondent à un numéro: 138, 56789, 1987 (ceux-là sont bien triés). Mais parmis eux, se trouvent aussi des chaînes alphanumériques type: ECO29, ECO122, ECO1115, ECO1116.

    Si on considère le vecteur suivant: 138, 56789, 1987, ECO29, ECO122, ECO1115, ECO1116.

    Le tri que j'attends est celui-ci:
    138
    1987
    56789
    ECO29
    ECO122
    ECO1115
    ECO1116

    Et ce que me retourne ma fonction actuellement est:
    138
    1987
    56789
    ECO1115
    ECO1116
    ECO122
    ECO29

    Quelqu'un connait-il la raison pour laquelle il considère ECO122 comme supérieur à ECO1115?

    D'avance merci.

    Bertrand.

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par pullin
    Quelqu'un connait-il la raison pour laquelle il considère ECO122 comme supérieur à ECO1115?
    oui, il considère les valeurs ASCII lors du tri: il n'y a pas de conversion vers un int (122 et 1115 sont vus comme du texte): or, "2" est plus grand que "1"...

    ça donne la même chose en essayant de trier "AAAE" et "ABB" -> AAAE passe en premier

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    J'avais bien imaginé qu'il utilisait le code ASCII pour comparer les chaînes, mais ce qui me surprenait, c'est qu'il semble s'arrêter à un certain nombre de caractères, sans prendre en compte le fait qu'une chaîne soit plus grande que l'autre (comme il le fait lorsqu'il compare des String qui sont uniquement des caractères numériques...).

    Quelqu'un verrait-il un moyen de contournement "propre" à ce problème (c'est-à-dire, sans faire du substring au cas par cas....)?

    Merci.

    Bertrand.

  4. #4
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    bonjour

    soit il faut ajouter des 0 pour que les nombres aient tous la même taille :

    ECO0029
    ECO1152
    ...

    Soit il faut fair du substring



    bon courage.

  5. #5
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Le fait de rajouter des 0 me semble difficilement envisageable. En effet, ce sont de données que je récupère de la base, et que je dois afficher dans une édition. De ce fait, ce que je publie doit être conforme à ce qui se trouve en base.

    Personne n'a été confronté à ce problème, ou ne connait d'autre fonction/moyen afin d'effectuer mon tri....?

    Merci d'avance.

    Bertrand.

  6. #6
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    alors tu vas etre obligé de séparer tes caractères alphabétiques de tes caractères numériques.

    doit y avoir moyen de faire ca avec un petit split et une expression régulière adéquate (j'y connais pas grande chose en expression regulière alors je vais laisser la parole aux experts )

  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,


    Quel est ta logique de tri ? En gros en quoi tu considère que ECO1115 doit ête supérieur à ECO122 ???

    Une fois que tu aura déterminé tout cela il reste à écrire l'algo correspondant...

    a++

    PS : Et pour trier une liste tu peux utiliser la méthode Collections.sort()

  8. #8
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    En terme de comparaison de chaines de caractères, ton programme fonctionne. En effet, en tant que chaine de caractere, ECO1115 est bien inférieur à ECO122. s'ils étaient dans un dictionnaire, ils seraient bien dans ce sens, de la meme facon que garage se trouve avant gare dans le dictionnaire, meme si gare est plus court...
    Effectivement, 1115 est supérieur à 122, mais uniquement en terme numérique.
    Donc en gros, si tu veux une logique numérique pour la fin de tes chaines, il faut les couper en deux, traiter les lettres et les chiffres indépendemment et surtout, traiter les chiffres comme tels (comparaison d'entier et pas de string).
    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java
    "La liberté de tout être s'arréte là où commence celle de l'autre... Respecter l'autre, c'est préserver sa liberté d'être, de penser et de vivre"

  9. #9
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Quel est ta logique de tri ? En gros en quoi tu considère que ECO1115 doit ête supérieur à ECO122 ???


    Ma logique de tri est: classement des nombre dans un ordre croissant et des caractères alphanumériques de type ECOxxx par ordre numérique croissant.

    En effet, il faut que je coupe mes string et que ma comparaison soit d'ordre numérique si je veux obtenir une suite numérique croissante...donc du bon vieux substring et de la conversion en entier...

    Je crois que je n'ai pas le choix.

    Merci pour tout.

    Bertrand.

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

Discussions similaires

  1. Problème de tri avec TrouverEnregistrement
    Par franval dans le forum IHM
    Réponses: 2
    Dernier message: 09/09/2008, 22h27
  2. Problème de tri avec une macro
    Par Imer2008 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/06/2008, 14h19
  3. problème de tri avec une requête ajout
    Par funkyjul dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 25/03/2008, 11h53
  4. Problème de tri avec une relation de type n-n
    Par toutoune60 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/06/2007, 10h52
  5. Problème de tri avec analyse croisée
    Par drthodt dans le forum Access
    Réponses: 2
    Dernier message: 18/10/2005, 16h23

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