web-dev-qa-db-fra.com

Quel est le moyen le plus simple de générer une chaîne de n caractères répétés?

Étant donné le caractère c et le nombre n, comment puis-je créer une chaîne composée de n répétitions de c? Le faire manuellement est trop lourd:

StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; ++i)
{
    sb.append(c);
}
String result = sb.toString();

Il y a sûrement une fonction de bibliothèque statique qui le fait déjà pour moi?

25
foobar
int n = 10;
char[] chars = new char[n];
Arrays.fill(chars, 'c');
String result = new String(chars);
38
G_H

Si vous le pouvez, utilisez StringUtils chez Apache Commons Lang :

StringUtils.repeat("ab", 3);  //"ababab"
22
Tomasz Nurkiewicz
14
Jeremy

Pour avoir une idée de la pénalité de vitesse, j'ai testé deux versions, une avec Array.fill et une avec StringBuilder.

public static String repeat(char what, int howmany) {
    char[] chars = new char[howmany];
    Arrays.fill(chars, what);
    return new String(chars);
}

et 

public static String repeatSB(char what, int howmany) {
    StringBuilder out = new StringBuilder(howmany);
    for (int i = 0; i < howmany; i++)
        out.append(what);
    return out.toString();
}

en utilisant 

public static void main(String... args) {
    String res;
    long time;

    for (int j = 0; j < 1000; j++) {
        res = repeat(' ', 100000);
        res = repeatSB(' ', 100000);
    }
    time = System.nanoTime();
    res = repeat(' ', 100000);
    time = System.nanoTime() - time;
    System.out.println("elapsed repeat: " + time);

    time = System.nanoTime();
    res = repeatSB(' ', 100000);
    time = System.nanoTime() - time;
    System.out.println("elapsed repeatSB: " + time);
}

(notez que la boucle dans la fonction principale est de lancer en JIT)

Les résultats sont les suivants:

elapsed repeat  : 65899
elapsed repeatSB: 305171

C'est un énorme différence

4
Panayotis

Voici une méthode O(logN), basée sur l'algorithme d'alimentation binaire standard:

public static String repChar(char c, int reps) {
    String adder = Character.toString(c);
    String result = "";
    while (reps > 0) {
        if (reps % 2 == 1) {
            result += adder;
        }
        adder += adder;
        reps /= 2;
    }        
    return result;
}

Les valeurs négatives pour reps renvoient la chaîne vide.

1
rossum

regardez cet échantillon

Integer  n=10;
String s="a";
String repeated = new String(new char[n]).replace("\0", s);

réponse sous forme Moyen simple de répéter une chaîne en Java alors votez là-haut

1
Basheer AL-MOMANI

Ajoutez-le simplement à votre propre ...

public static String generateRepeatingString(char c, Integer n) {
    StringBuilder b = new StringBuilder();
    for (Integer x = 0; x < n; x++)
        b.append(c);
    return b.toString();
}

Ou Apache commons a une classe utilitaire que vous pouvez ajouter.

0
Mike Thomsen