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 :

Conversion String vers char


Sujet :

Langage Java

  1. #1
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut Conversion String vers char
    Bonjour,

    Connaissez vous une méthode de l'API Java qui permette de convertir une chaine représentant un caractère en ce caractère ?

    Une méthode qui ferait quelque chose comme ça :

    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
        public static char toChar(String s)
        {
            if (s == null)
                throw new NullPointerException("La chaîne ne doit pas être null");
     
            if (s.length() == 0)
                throw new IllegalArgumentException("La chaine ne doit pas être vide");
     
            if (s.equals("\\n"))
                return '\n';
     
            if (s.equals("\\t"))
                return '\t';
     
            // ...
     
            if (s.startsWith("\\u") && s.length() > 2)
                return (char) Integer.valueOf(s.substring(2), 16).intValue();
     
            return s.charAt(0);
        }
    ou bien une meilleure manière de faire cela ?

    Merci par avance.

  2. #2
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    la methode charAt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String chaine="x";
    char c=chaine.charAt(0);

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    Citation Envoyé par willoi
    la methode charAt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String chaine="x";
    char c=chaine.charAt(0);

    ça marche pas pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if (s.equals("\\n"))
                return '\n';
    tu peux limiter la casse en utlilisant toCharArray() et les switch qui marchent avec char !
    mais si tu veux gérer des char non simple \t .... je vois pas de solution en 2 lignes

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    de toute facon cette fonction recherche ne fera rien de plus que ce que tu fais deja .....
    Par contre rien ne t'empeche de te creer une classe "API" qui te met a disposition une bonne fois pour toutes cette api.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Si j'ai bien compris, le string "s" est toujours un caractère, que tu veux convertir en char ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      public static char toChar(String s)
        {
            // Traitement de sécurité (null, lenght, ...)
            return s.toCharArray()[0];
        }

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Si j'ai bien compris, le string "s" est toujours un caractère, que tu veux convertir en char ?
    visiblement non.
    Il a l'air de vouloir convertir aussi les carteres speciaux tels de "\n", "\t", etc ... qui prennent plusieurs caracteres dans une chaine "texturelle"

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Je ne pense pas, d'après
    Citation Envoyé par benwit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public static char toChar(String s)
        {
             if (s.equals("\\n"))
                return '\n';
     
            if (s.equals("\\t"))
                return '\t';
     
            return s.charAt(0);
        }
    A mon avis, le string "s" est toujours une chaine comprenant un caractère et un seul. Et même si ce n'est pas le cas, ma méthode est plus simple

  8. #8
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    Si vous regardez bien mon exemple, la chaîne s peut représenter aussi bien
    • un caractère spécial tel que "\n", "\t" : (2 caractères),
    • un caractère codé en unicode "\uxxxx" ou xxxx est la valeur hexadécimale (3 à 6 caractères)
    • un simple caractère tel que "a" (1 caractère) - cas trivial -.


    JohnNC, en quoi est plus simple que ?

    Et en plus, aussi bien l'une que l'autre ne traite pas les cas partculiers :
    "\n".toCharArray()[0] retourne '\' et "\n".toCharArray()[1] retourne 'n'

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    c'est ce que je t'ai dis tu peux pas couper à faire une fonction traitant tout les cas qui t'intéressent à l'aide de toCharArray() et des switch

  10. #10
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    C'est aussi ce que je pense : charAt(0) lorsque la chaine est de longueur 1, et tests pour les autres.
    En revanche, le switch ne m'est d'aucune utilité (tant qu'il ne traitera pas les chaînes) !!!

    Je voulais juste savoir si quelqu'un avait une autre idée (ne perdez pas votre temps à me redire ce qu'il y a dans mon exemple ).
    Ce que je repproche à ma méthode, c'est d'oublier potentiellement certains caractères spéciaux ! Je vais rajouter \r, \f, ... mais j'en oublie surement ?

  11. #11
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par benwit
    En revanche, le switch ne m'est d'aucune utilité (tant qu'il ne traitera pas les chaînes) !!!
    Il traite les chaines ....
    Suffit de creer un tableau de string ou liste quelconque contenant les chaines non unitaires et de recuperer l'index de l'element egal a la chaine passe en argument.
    Je ne connait pas la syntaxe mais il me semble avoir vu un truc qui fait ca.

    Le case s'applique donc sur l'index renvoyé.
    C'ets une astuce Delphi qui n'accepte que des entier (meme pas des caracteres) dans ses cases.

  12. #12
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    autre astuce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String specialChar = "\\n \\t";
    switch specialChar.indexOf(s) {
        0 : // Traitement de "\\n"; 
        4 : // Traitement de "\\t";
    [...]

  13. #13
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    ok pour ta 2° astuce si on supose qu'une des chaine n'est pas une sous chaine de l'autre (ce qui semble être le cas dans mon exemple) sinon il y aura des probléme avec le indexOf().

    En en ce qui concerne le switch avec le tableau de string, je demande à voir l'implémentation (comment tu fais la comparaison ?)... car je crois avoir lu que justement la gestion des string dans le swicth (similaire au int, char et enum) est prévu pour une prochaine version de java.

  14. #14
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par benwit
    ok pour ta 2° astuce si on supose qu'une des chaine n'est pas une sous chaine de l'autre (ce qui semble être le cas dans mon exemple) sinon il y aura des probléme avec le indexOf().
    Bien sur ....
    Ce n'est qu'une astuce pas une technique de prog
    La difference reside dans les limites d'utilisation plus forte de la premiere :p

    Citation Envoyé par benwit
    En en ce qui concerne le switch avec le tableau de string, je demande à voir l'implémentation (comment tu fais la comparaison ?)... car je crois avoir lu que justement la gestion des string dans le swicth (similaire au int, char et enum) est prévu pour une prochaine version de java.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    index = -1;
    for (i=0; i<tab.length; i++)
        if (tab[i].equals(s)) { index = i; break; }
    switch (index) {
    [...]
    }

    Tu peux aussi utiliser une list (avec des add et un "find" ou "getIndex") mais quoi qu'il arrive tu passe pas un "for".
    Le mieux est d'externaliser le for dans une fonction qui renvoie l'index .... ca allege pas mal le code (mieux qu'une serie de if)

  15. #15
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    Ok, je t'accorde qu'on peut dire d'une certaine manière qu'on peut gérer des strings dans un switch même si ce n'est pas encore de la manière classique (jdk 1.7 ?) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    switch(chaine)
    {
         case "c1" :
         case "c2" :
    ...
    }

    Sinon, avec ta façon de faire (l'utilisation d'un tableau), quitte à le parcourir, je pense qu'on peut dès lors se passer du switch par la suite et utiliser l'équivalent d'un pointeur de fonction pour executer le code directement.

    Autrement dit, en java, cela consisterait à avoir un tableau d'objet fonction qui contiendrait à la fois la chaine de comparaison et le code à executer (même si dans mon exemple, le code étant tellement léger qu'il ne justifie peut être pas la création d'objet fonction).

  16. #16
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Sinon, avec ta façon de faire (l'utilisation d'un tableau), quitte à le parcourir, je pense qu'on peut dès lors se passer du switch par la suite et utiliser l'équivalent d'un pointeur de fonction pour executer le code directement.
    Si c'est pour faire ca .. autant garder la serie de IF
    Le but de telles choses et de clarifier le code, plus au niveau de la lisibilité que des performances.

    ca sert pasa grand chose de faire des moteurs a faible conso si c'ets pour appuyer comme un bourrin derriere

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Citation Envoyé par benwit
    Si vous regardez bien mon exemple, la chaîne s peut représenter aussi bien
    • un caractère spécial tel que "\n", "\t" : (2 caractères),
    • un caractère codé en unicode "\uxxxx" ou xxxx est la valeur hexadécimale (3 à 6 caractères)
    • un simple caractère tel que "a" (1 caractère) - cas trivial -.


    JohnNC, en quoi est plus simple que ?

    Et en plus, aussi bien l'une que l'autre ne traite pas les cas partculiers :
    "\n".toCharArray()[0] retourne '\' et "\n".toCharArray()[1] retourne 'n'
    Alors ça, je demande à voir ! "\n" ne contient qu'un seul caractère, et non 2 !
    "\n".toCharArray()[1] te sortira un indexArrayOutOfBoundException ! et "\n".toCharArray()[0] retournera '\n'.

    P.S : Par contre, je n'avais pas vu que les "\\n" dans le string, auquel cas il y a bien 2 caractères là. J'étais parti sur un string ne contenant qu'un seul caractère, y compris caractères spéciaux.

  18. #18
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    JohnNC,
    je me suis en effet trompé en écrivant, je voulais dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "\\n".toCharArray()[0] retourne '\' et "\\n".toCharArray()[1] retourne 'n'
    Je sais que \n dans une chaine ne réprésente qu'un seul caractère mais si je tape les 2 caractères \n dans un JTextfield par exemple, texfield.getText().toCharArray()[0] retourne '\' et texfield.getText().toCharArray()[1] etourne 'n'
    C'est pour cela que je me suis trompé car en écrivant directement la chaîne dans le code, j'ai oublié d'échappé la caractère \ comme je l'avais fait dans mon exemple.

    Donc, si elle reste d'actualité (à toi de voir), je réitère ma question :
    en quoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    s.toCharArray()[0]
     
    est plus simple que
     
    s.charAt(0);
    ?



    Si c'est pour faire ca .. autant garder la serie de IF
    Le but de telles choses et de clarifier le code, plus au niveau de la lisibilité que des performances.
    Clorish,
    Je suis à peu près d'accord :
    - dans mon cas, autant garder les if pour ce que je fais au lieu d'utiliser un tableau d'objets fonctions (moins clair).
    - d'accord aussi sur le fait que ta proposition clarifie le code avec le switch de String :
    switch(methodeQuiFaitLeForEtRetourneIndice(chaine))
    {
    case 0 : //
    case 1 : //
    //...
    }

    - en revanche, si dans chaque case, j'avais du code lourd, je reste convaincu que l'utilisation d'un tableau d'objets fonctions reste non seulement plus performant et aussi beaucoup plus propre !!!

  19. #19
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    - en revanche, si dans chaque case, j'avais du code lourd, je reste convaincu que l'utilisation d'un tableau d'objets fonctions reste non seulement plus performant et aussi beaucoup plus propre !!!
    ce la va de soit

    Je ne depasse rarement les 2 lignes dans les cases
    Je prefere appeler une methode privee qui effectue le traitement lourd.

    Note : J'aime bien aussi declarer des constantes pour clarifier l'indexation du case ....

    C'est avec du code clair et des astuces de codages que l'on gagne enormement du temps sur le debugage. Il faut savoir jouer avec les messages du compilo.

    Petite astuce gratuite :
    il vaut mieux :
    que :
    une mauvaise habitude de langages comme delphi ou une simple etourderie du type :
    genere une erreur de compilation dans le premier cas : "partie gauche non affectable", mais rien dans le 2e. Bien au contraire, l'affectaiton retourne 2 qui est synonyme de vrai (ou faux, je sais jamais ) ....

  20. #20
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Clorish
    genere une erreur de compilation dans le premier cas : "partie gauche non affectable", mais rien dans le 2e. Bien au contraire, l'affectaiton retourne 2 qui est synonyme de vrai (ou faux, je sais jamais ) ....
    Pas en java... un int n'est pas castable en boolean...
    Donc, if(n=2) ça ne fait ni vrai ni faux (le n=2, ça vaut 2), ça ne compile pas...

Discussions similaires

  1. C++ Builder XE3 Conversion String vers Char *
    Par kurul1 dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/04/2013, 10h27
  2. [Débutant] Conversion string vers char
    Par sachaaaz dans le forum C#
    Réponses: 6
    Dernier message: 12/03/2012, 12h42
  3. Conversion String vers Byte
    Par zulianithomas dans le forum Delphi
    Réponses: 8
    Dernier message: 07/10/2006, 11h09
  4. conversion string vers int
    Par mathher dans le forum C++
    Réponses: 4
    Dernier message: 14/04/2006, 18h52
  5. [MFC] Problème de conversion CString vers Char *
    Par Darkenshin dans le forum MFC
    Réponses: 10
    Dernier message: 02/12/2005, 15h42

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