97 votes

java : utiliser StringBuilder pour insérer au début

Je ne pouvais le faire qu'avec String, par exemple :

String str="";
for(int i=0;i<100;i++){
    str=i+str;
}

Existe-t-il un moyen d'y parvenir avec StringBuilder ? Merci.

201voto

Mehrdad Points 70493
StringBuilder sb = new StringBuilder();
for(int i=0;i<100;i++){
    sb.insert(0, Integer.toString(i));
}

Attention : Cela va à l'encontre de l'objectif de StringBuilder mais il fait ce que vous avez demandé.


Une meilleure technique (même si ce n'est pas encore l'idéal) :

  1. Inverser chaque la chaîne que vous voulez insérer.
  2. Ajouter chaque chaîne de caractères à un StringBuilder .
  3. Inverser le tout le site StringBuilder quand vous aurez terminé.

Cela va transformer un O( n ²) en O( n ).

33voto

ratchet freak Points 22412

Vous pouvez utiliser strbuilder.insert(0,i);

2 votes

Pourquoi est-ce que cela a obtenu tant de likes ! La classe n'est pas définie correctement - seulement la signature de l'appel de la méthode !

14voto

Speck Points 891

Peut-être que j'ai raté quelque chose mais vous voulez vous retrouver avec une chaîne qui ressemble à ça, "999897969594...543210" n'est-ce pas ?

StringBuilder sb = new StringBuilder();
for(int i=99;i>=0;i--){
    sb.append(String.valueOf(i));
}

0 votes

Il est étrange que ce post n'ait pas obtenu beaucoup de votes alors qu'il fournit la solution par une manipulation astucieuse de la boucle,

2 votes

@nom-mon-ir il a juste inversé la chaîne. Il ne répond pas à la question de savoir comment ajouter à gauche.

0 votes

Permet d'obtenir l'effet souhaité.

7voto

Vasile Jureschi Points 661

Comme solution alternative, vous pouvez utiliser une structure LIFO (comme une pile) pour stocker toutes les chaînes et lorsque vous avez terminé, il suffit de les sortir et de les mettre dans le StringBuilder. Celui-ci inverse naturellement l'ordre des éléments (chaînes) qui y sont placés.

Stack<String> textStack = new Stack<String>();
// push the strings to the stack
while(!isReadingTextDone()) {
    String text = readText();
    textStack.push(text);
}
// pop the strings and add to the text builder
String builder = new StringBuilder(); 
while (!textStack.empty()) {
      builder.append(textStack.pop());
}
// get the final string
String finalText =  builder.toString();

4 votes

ArrayDeque doit être utilisé à la place de Stack . " Un ensemble plus complet et cohérent d'opérations de pile LIFO est fourni par l'interface {@link Deque} et ses implémentations, qui doivent être utilisées de préférence à cette classe. "

5voto

Benjamin Points 186

Ce fil est assez ancien, mais vous pourriez aussi penser à une solution récursive en passant le StringBuilder à remplir. Cela permet d'éviter tout traitement inverse, etc. Il suffit de concevoir votre itération avec une récursion et de décider soigneusement d'une condition de sortie.

public class Test {

    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        doRecursive(sb, 100, 0);
        System.out.println(sb.toString());
    }

    public static void doRecursive(StringBuilder sb, int limit, int index) {
        if (index < limit) {
            doRecursive(sb, limit, index + 1);
            sb.append(Integer.toString(index));
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X