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

avec Java Discussion :

Faire un substring à partir d'un StringBuffer et récupérer un StringBuffer


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut Faire un substring à partir d'un StringBuffer et récupérer un StringBuffer
    Bonjour,

    Voilà, je me posais une question qui me semble bête, mais je voudrais savoir quelle est la méthode "propre" pour faire un substring à partir d'un StringBuffer, mais en récupérant un StringBuffer et pas un String.
    Voila un code simplifié du problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    StringBuffer ret = new StringBuffer();
    for (maClasse elemCourant: listeElement) {
       ret.append(elemCourant.getLibelle()).append(", ");
    }
    // ret.substring(0, ret.length() - 2);
    A l'endoit du commentaire, je voudrais supprimer la dernière virgule, mais dans la mesure ou j'ai d'autres traitements à faire sur mon StringBuffer, je voudrai garder un StringBuffer et pas passer en String.
    J'imagine que je pourrais recréer un StringBuffer à partir de mon String obtenu avec substring, mais je trouve ça relativement idiot en fait.
    Bref, quelle est la méthode élégante ?

    Merci d'avance !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 130
    Par défaut
    Pourquoi ne pas utiliser les methodes delete(int start,int end) ou deleteCharAt(int location) ?

  3. #3
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Alors pour supprimer la dernière virgule .. cela serait pas plus élégant de tester pour ne pas la mettre ? Et surement plus efficace.

    Maintenant pour le StringBuffer (Note que sun recommande StringBuilder) je vois plusieurs approche.

    delete(start, end)
    deleteCharAt(index)

    et enfin subSequence qui te retourne un CharSequence que tu peux re-utiliser ensuite.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    StringBuffer ret = new StringBuffer();
    String sep = "";
    for (maClasse elemCourant: listeElement) {
       ret.append(sep).append(elemCourant.getLibelle());
       sep = ", ";
    }

  5. #5
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut
    Delete... Et en plus, j'ai parcouru la doc.
    On va dire qu'on est vendredi et que je suis fatigué.

    En tout cas merci !
    (me disait bien aussi que c'était pas possible que ca existe pas)

  6. #6
    Membre éprouvé
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Par défaut
    bhamp0 > Oui, c'est ce que j'avais fait à la place (enfin, une variante avec un booleen), mais la question me turlupinait quand même.

    Autre question du coup, c'est plus rentable de faire une assignation d'un String dans une boucle ou de supprimer ce qui a été concaténé en trop ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Par défaut
    Citation Envoyé par Rakken Voir le message
    bhamp0 > Oui, c'est ce que j'avais fait à la place (enfin, une variante avec un booleen), mais la question me turlupinait quand même.
    La façon que je donne permet d'éviter d'utiliser un boolean + un test ; ça "automatise" le traitement.

    Citation Envoyé par Rakken Voir le message
    Autre question du coup, c'est plus rentable de faire une assignation d'un String dans une boucle ou de supprimer ce qui a été concaténé en trop ?
    Rentable dans quel sens ? Mémoire ou temps ?
    Ca risque d'être kif kif, mais j'aime pas l'idée de devoir traiter des cas particuliers.
    La solution à coup de "length - 2" t'oblige à vérifier si ta liste n'était pas vide au départ (un "setLength(-2)" doit provoquer une erreur, je pense). Donc la ~meilleure~ solution à mon sens est celle qui te permet de ne pas avoir à gérer de cas particuliers à coup de "if then else".

  8. #8
    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 bulbo Voir le message
    Alors pour supprimer la dernière virgule .. cela serait pas plus élégant de tester pour ne pas la mettre ? Et surement plus efficace.
    Pas si sûr...


    Le fait de supprimer les caractères en trop est à la fois simple et efficace (à noter que dans le cas des derniers caractères, on peut se contenter d'un setLength()) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	for (String s : list) {
    		sb.append(s).append(", ");
    	}
    	sb.setLength(sb.length()-2);

    Il y a plusieurs moyen de ne pas mettre le dernier séparateur, mais cela implique plusieurs vérifications préalable pas forcément aussi lisible ni clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	if (!list.isEmpty()) {
    		sb.append(list.get(0));
    		for (String s : list.subList(1, list.size())) {
    			sb.append(", ").append(s);
    		}
    	}
    Le tout pour un gain qui doit être vraiment minime...


    a++

    PS : Sinon +1 pour le StringBuilder depuis Java 5

  9. #9
    Membre expérimenté
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Pas si sûr...
    (...)
    Le premier code que tu donnes oblige aussi des vérifications préalables. Le code exact doit être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(!list.isEmpty()) {
         for (String s : list) {
              sb.append(s).append(", ");
         }
         sb.setLength(sb.length()-2);
    }

  10. #10
    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
    Oui en effet

    a++

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/09/2011, 18h14
  2. Faire un variable à partir d'un mot dans un txt
    Par Apophis03 dans le forum C
    Réponses: 16
    Dernier message: 21/12/2005, 15h53
  3. [XSLT] Faire un substring-after à un emplacement précis
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 21/12/2005, 11h50
  4. Comment faire du MDX à partir d'une requete SQL?
    Par Immobilis dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 10/11/2005, 09h46
  5. [DOS] faire un substring en commande DOS
    Par blaz dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 10/01/2005, 10h09

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