113 votes

Puis-je multiplier des chaînes de caractères en Java pour répéter des séquences ?

J'ai quelque chose comme ce qui suit :

int i = 3;
String someNum = "123";

J'aimerais ajouter i Les "0" aux someNum chaîne. Existe-t-il un moyen de multiplier une chaîne pour la répéter, comme le fait Python ?

Donc je pourrais juste y aller :

someNum = sumNum + ("0" * 3);

ou quelque chose de similaire ?

Où, dans ce cas, mon résultat final serait :

"123000".

2 votes

Question connexe - stackoverflow.com/q/1235179/596361 - traite également des chaînes répétitives

0 votes

Mise à jour : désormais intégré à Java 11+. Voir Réponse de Naman .

99voto

Andi Points 61

La méthode la plus simple, en Java pur et sans dépendances, est la suivante :

new String(new char[generation]).replace("\0", "-")

Remplacer génération avec le nombre de répétitions, et le "-" avec la chaîne (ou le caractère) à répéter.

Tout ce que cela fait est de créer une chaîne vide contenant n nombre de caractères 0x00, et la méthode intégrée String#replace fait le reste.

Voici un exemple à copier et à coller :

public static String repeat(int count, String with) {
    return new String(new char[count]).replace("\0", with);
}

public static String repeat(int count) {
    return repeat(count, " ");
}

public static void main(String[] args) {
    for (int n = 0; n < 10; n++) {
        System.out.println(repeat(n) + " Hello");
    }

    for (int n = 0; n < 10; n++) {
        System.out.println(repeat(n, ":-) ") + " Hello");
    }
}

1 votes

Joli coup ! Les "one liners" sont toujours super

0 votes

Je le cherchais depuis des années et je l'ai enfin trouvé.

0 votes

Pour moi, cela ne fonctionnait qu'avec "\u0000" au lieu de "\0"

36voto

les2 Points 3854

Non, mais vous le pouvez en Scala ! (Et ensuite compiler le tout et l'exécuter en utilisant n'importe quelle implémentation Java !!!!)

Maintenant, si vous voulez le faire de manière simple en Java, utilisez le paquet Apache commons-lang. En supposant que vous utilisez maven, ajoutez cette dépendance à votre pom.xml :

    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.4</version>
    </dependency>

Et ensuite utiliser StringUtils.repeat comme suit :

import org.apache.commons.lang.StringUtils
...
someNum = sumNum + StringUtils.repeat("0", 3);

9 votes

Comment avez-vous supposé qu'il utilise maven ? :)

5 votes

Il faut faire des hypothèses pour résoudre les problèmes du monde réel. Dans ce cas, j'utilise maven sur mon projet actuel. J'ai un pom.xml configuré avec la dépendance commons-lang. En bref, cela m'a permis de répondre plus facilement à sa question. Et je ne sais pas exactement ce que je ferais si je n'utilisais pas maven - je suppose que je devrais créer un emplacement personnalisé pour mes fichiers jar ... similaire à un dépôt maven ! Et puis inclure ces fichiers jar dans mon classpath et faire toutes sortes de choses que je préfère éviter. Si l'auteur de l'article veut vraiment pirater java, il doit utiliser maven ou son équivalent :)

1 votes

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> would be more "modern" version

27voto

Matt Ball Points 165937

Google Guava fournit un autre moyen de le faire avec Strings#repeat() :

String repeated = Strings.repeat("pete and re", 42);

20voto

BalusC Points 498232

Deux manières me viennent à l'esprit :

int i = 3;
String someNum = "123";

// Way 1:
char[] zeroes1 = new char[i];
Arrays.fill(zeroes1, '0');
String newNum1 = someNum + new String(zeroes1);
System.out.println(newNum1); // 123000

// Way 2:
String zeroes2 = String.format("%0" + i + "d", 0);
String newNum2 = someNum + zeroes2;
System.out.println(newNum2); // 123000

La voie 2 peut être raccourcie à :

someNum += String.format("%0" + i + "d", 0);
System.out.println(someNum); // 123000

En savoir plus String#format() est disponible en son document API et celle de java.util.Formatter .

3 votes

La méthode 1 ne fonctionne qu'avec des caractères uniques, la méthode 2 ne fonctionne qu'avec un seul '0'. Ce n'est pas exactement ce que j'appellerais une solution générique au problème...

1 votes

Je ne sais pas trop de quoi vous parlez, mais c'est au moins une solution appropriée au problème du PO :) Si vous avez un problème, posez une question.

19voto

Dave Hartnoll Points 471

Si vous répétez des caractères uniques, comme dans le cas du PO, et que le nombre maximal de répétitions n'est pas trop élevé, vous pouvez utiliser une simple opération de sous-chaîne comme celle-ci :

int i = 3;
String someNum = "123";
someNum += "00000000000000000000".substring(0, i);

2 votes

Ce n'est pas une réponse générale si vous me demandez, si je voulais faire "123" * 3, votre solution ne fonctionnera pas. Ok, c'est élégant pour les caractères uniques, mais ce n'est pas flexible :)

2 votes

@Silviu Ce n'est pas une réponse générale si vous demandez à quelqu'un, et personne n'a demandé une réponse générale. Mes commentaires d'ouverture couvrent les cas pour lesquels cela fonctionne, y compris le cas de l'OP.

0 votes

Très pragmatique, j'aime bien

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