Je suis à la recherche d'une méthode ou d'un opérateur commun simple qui me permet de répéter quelques fois n String . Je sais que je pourrais écrire ceci en utilisant une boucle for, mais je souhaite éviter les boucles for chaque fois que nécessaire et une méthode directe simple devrait exister quelque part.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Relative à:
répéter la chaîne javascript Créer NSString en répétant une autre chaîne un certain nombre de fois
Édité
J'essaye d'éviter les boucles quand elles ne sont pas complètement nécessaires car:
Ils ajoutent au nombre de lignes de code même s'ils sont cachés dans une autre fonction.
Quelqu'un qui lit mon code doit comprendre ce que je fais dans cette boucle for. Même s'il est commenté et a des noms de variables significatifs, ils doivent toujours s'assurer qu'il ne fait rien de «intelligent».
Les programmeurs adorent mettre des choses intelligentes dans les boucles, même si je l'écris pour "ne faire que ce qu'il est censé faire", cela n'empêche pas quelqu'un de venir et d'ajouter quelques "correctifs" supplémentaires.
Ils sont très souvent faciles à se tromper. Pour les boucles impliquant des index, les bugs ont tendance à se produire.
Pour les boucles, réutilisez souvent les mêmes variables, ce qui augmente les chances de trouver des bogues de portée très difficiles.
Pour les boucles, augmentez le nombre d'endroits qu'un chasseur de bogues doit rechercher.
Réponses:
String::repeat
Nouveau dans Java 11 est la méthode
String::repeat
qui fait exactement ce que vous avez demandé:Son Javadoc dit:
la source
"abc".repeat(3)
Voici la version la plus courte (Java 1.5+ requis):
Où
n
est le nombre de répétitions de la chaîne ets
la chaîne à répéter.Aucune importation ou bibliothèque nécessaire.
la source
char[]
, dans ce cas) sont instanciés avec des valeurs nulles, puis unString
est créé à partir de lachar[]
, et les valeurs nulles sontreplaced()
avec le caractère que vous souhaitez danss
...replace('\0', str)
utilisez plutôt la version String.replace(char oldChar, char newChar)
etreplace(CharSequence target, CharSequence replacement)
donc je ne vois pas comment cela pourrait fonctionnerSi vous utilisez Java <= 7 , c'est aussi "concis" que possible:
En Java 8 et supérieur, il existe un moyen plus lisible:
Enfin, pour Java 11 et supérieur, il existe une nouvelle
repeat(int count)
méthode spécialement pour cela ( lien )Alternativement, si votre projet utilise des bibliothèques java, il y a plus d'options.
Pour Apache Commons :
Pour Google Guava :
la source
n
est zéro.s
doit être String, pas unChar
Commons Lang StringUtils.repeat ()
Usage:
la source
Java 8
String.join
fournit une manière ordonnée de le faire en conjonction avecCollections.nCopies
:la source
Voici un moyen de le faire en utilisant uniquement des fonctions String standard et aucune boucle explicite:
la source
replace()
. Dans Java 1.5+, il existe une version surchargéereplace()
qui prend deuxCharSequence
s (qui incluentString
s): download.oracle.com/javase/1.5.0/docs/api/java/lang/…n=3
: il formate d'abord une chaîne pour ressembler à quelque chose%03d
(%%
c'est pour échapper au signe de pourcentage), qui est le code de mise en forme pour ajouter 3 zéros de remplissage, puis formate0
avec cela, conduisant à000
, et enfin remplace chaque0
par les chaînesSi vous êtes comme moi et que vous souhaitez utiliser Google Guava et non Apache Commons. Vous pouvez utiliser la méthode repeat dans la classe Guava Strings.
la source
Avec java-8, vous pouvez également utiliser
Stream.generate
.et vous pouvez l'envelopper dans une méthode utilitaire simple si nécessaire:
la source
return IntStream.range(0, times).mapToObj(i -> str).collect(joining());
qui parallèle mieuxVous voulez donc éviter les boucles?
Ici vous l'avez:
(bien sûr, je sais que c'est moche et inefficace, mais il n'a pas de boucles :-p)
Vous le voulez plus simple et plus joli? utilisez jython:
Edit : optimisons-le un peu :-D
Edit2 : J'ai fait un benchmark rapide et sale pour les 4 principales alternatives, mais je n'ai pas le temps de l'exécuter plusieurs fois pour obtenir les moyens et tracer les temps pour plusieurs entrées ... Alors voici le code si quelqu'un veut pour l'essayer:
Il prend 2 arguments, le premier est le nombre d'itérations (chaque fonction s'exécute avec des temps de répétition arg de 1..n) et le second est la chaîne à répéter.
Jusqu'à présent, une inspection rapide des temps d'exécution avec différentes entrées laisse le classement quelque chose comme ça (de mieux en pire):
Je n'aurais jamais deviné que la fonction récursive était plus rapide que la
for
boucle: -oAmusez-vous (ctional xD).
la source
Cela contient moins de caractères que votre question
la source
commons-lang3.3.1-sources
et vous n'êtes plus aussi bon;) Mais si quelqu'un l'a déjàcommons-lang
, j'appuie votre réponse.basé sur la réponse de fortran , ceci est une version récursive qui utilise un StringBuilder:
la source
utiliser Dollar est aussi simple que de taper:
PS: la répétition fonctionne également pour le tableau, la liste, le jeu, etc.
la source
Je voulais une fonction pour créer une liste de points d'interrogation séparés par des virgules à des fins JDBC, et j'ai trouvé ce message. J'ai donc décidé de prendre deux variantes et de voir laquelle fonctionnait mieux. Après 1 million d'itérations, le StringBuilder, une variété de jardin, a pris 2 secondes (fun1), et la version cryptique supposée plus optimale (fun2) a pris 30 secondes. Quel est l'intérêt d'être à nouveau cryptique?
la source
Solution POO
Presque toutes les réponses proposent une fonction statique comme solution, mais en pensant orienté objet (à des fins de réutilisabilité et de clarté), j'ai trouvé une solution via la délégation via l'interface CharSequence (qui ouvre également l'utilisabilité sur les classes CharSequence mutables).
La classe suivante peut être utilisée avec ou sans Separator-String / CharSequence et chaque appel à "toString ()" crée la chaîne répétée finale. Les entrées / séparateurs ne sont pas seulement limités à String-Class, mais peuvent être toutes les classes qui implémentent CharSequence (par exemple StringBuilder, StringBuffer, etc.)!
Code source:
Exemple d'utilisation:
Exemple de sortie:
la source
en utilisant uniquement des classes JRE ( System.arraycopy ) et en essayant de minimiser le nombre d'objets temporaires, vous pouvez écrire quelque chose comme:
ÉDITER
et sans boucles, vous pouvez essayer avec:
EDIT 2
l'utilisation des collections est encore plus courte:
cependant j'aime toujours la première version.
la source
Pas le plus court, mais (je pense) le moyen le plus rapide est d'utiliser le StringBuilder:
la source
Si la vitesse est votre préoccupation, vous devez utiliser le moins de copie de mémoire possible. Il est donc nécessaire de travailler avec des tableaux de caractères.
Pour tester la vitesse, une méthode optimale similaire utilisant StirngBuilder est comme ceci:
et le code pour le tester:
Et voici les résultats de l'exécution de mon système:
Notez que le test de boucle consiste à lancer JIT et à obtenir des résultats optimaux.
la source
pour des raisons de lisibilité et de portabilité:
la source
Si vous êtes préoccupé par les performances, utilisez simplement un StringBuilder dans la boucle et faites un .toString () à la sortie de la boucle. Heck, écrivez votre propre classe Util et réutilisez-la. 5 lignes de code max.
la source
J'apprécie vraiment cette question. Il y a beaucoup de connaissances et de styles. Je ne peux donc pas le quitter sans montrer mon rock and roll;)
Aimes-tu?
la source
la source
Boucle simple
la source
times
au constructeur StringBuilder.Essayez ceci:
la source
En utilisant la récursivité, vous pouvez faire ce qui suit (en utilisant des opérateurs ternaires, une ligne max):
Je sais, c'est moche et probablement pas efficace, mais c'est une seule ligne!
la source
une solution simple en ligne:
nécessite Java 8
la source
Malgré votre désir de ne pas utiliser de boucles, je pense que vous devriez utiliser une boucle.
Vos raisons de ne pas utiliser de boucle for ne sont pas bonnes. En réponse à vos critiques:
la source
repetitions = -5
. b) téléchargez Commons Lang et exécutezrepeatString('a', 1000)
un million de fois en boucle; faites de même avec votre code; comparer les temps. Pour un crédit supplémentaire, faites de même avecrepeatString('ab', 1000)
.StringUtils.repeat("ab",1000)
? Parce que c'est ma réponse que vous avez rejetée. Il fonctionne également mieux et n'a pas de bugs.Si vous ne connaissez que la longueur de la chaîne de sortie (et qu'elle peut ne pas être divisible par la longueur de la chaîne d'entrée), utilisez cette méthode:
Démo d'utilisation:
Ne pas utiliser avec vide
s
etlength
> 0, car il est impossible d'obtenir le résultat souhaité dans ce cas.la source
voici le dernier Stringutils.java StringUtils.java
il n'a même pas besoin d'être aussi gros, peut être transformé en ceci, et peut être copié et collé dans une classe utilitaire dans votre projet.
Donc e5, je pense que la meilleure façon de faire serait d'utiliser simplement le code mentionné ci-dessus, ou l'une des réponses ici. mais lang communes est tout simplement trop grand si c'est un petit projet
la source
J'ai créé une méthode récursive qui fait la même chose que vous voulez .. n'hésitez pas à utiliser cela ...
j'ai la même réponse sur Puis-je multiplier les chaînes en java pour répéter les séquences?
la source
StringBuilder
plutôt.Vous pouvez utiliser cette méthode récursive pour votre objectif souhaité.
la source