Moyen Simple de répéter une Chaîne de caractères en java
Je suis à la recherche d'un simple communes de la méthode ou de l'opérateur qui me permet de répéter une Chaîne de caractères n fois. Je sais que je pourrais écrire cela à l'aide d'une boucle for, mais je veux éviter, pour des boucles à chaque fois que nécessaire, et une simple méthode directe doit exister quelque part.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Liés à:
répétez chaîne javascript
Créer NSString en répétant une autre chaîne de caractères en un nombre donné de fois
Édité
J'essaie d'éviter les boucles for, quand ils ne sont pas tout à fait nécessaire car:
-
Ils ajoutent au nombre de lignes de code, même si elles sont planquées dans une autre fonction.
-
Quelqu'un à la lecture de mon code pour comprendre ce que je fais en ce que pour la boucle. Même si il est commenté et a de sens des noms de variables, ils en ont encore pour s'assurer qu'il n'est pas de faire quoi que ce soit "intelligent".
-
Programmeurs aiment mettre des choses intelligentes dans les boucles for, même si j'écris c'est pour "faire uniquement ce pour quoi il est destiné à faire", cela n'empêche pas quelqu'un à venir le long et en ajoutant quelques autres intelligent "fix".
-
Ils sont très souvent facile de se tromper. Pour les boucles impliquant des indices tendent à générer par un bugs.
-
Pour des boucles souvent de réutiliser les mêmes variables, ce qui augmente les chances de vraiment difficile de trouver de délimitation de l'étendue de bugs.
-
Pour les boucles d'augmenter le nombre de places d'un bug hunter a regarder.
- Je comprends que pour les boucles peuvent causer des problèmes. Mais vous ne devriez pas essayer de l'éviter pour les boucles "à tout prix" parce que si il vous en coûte de la lisibilité, de la maintenabilité et de la vitesse, vous êtes d'être contre-productif. C'est l'un de ces cas.
- Avec ces préoccupations, envisager d'avoir exhaustive unittests pour votre code. Cela vous permet d'afficher uniquement l'unité de test lorsque la documentation est nécessaire.
- "Ils ajoutent au nombre de lignes de code, même si elles sont planquées dans une autre fonction"...wow, juste wow. Big-O, pas la Ldc
- Je suis pour éviter les boucles dans les situations où il m'en coûte la lisibilité et la maintenabilité. Je considère que la vitesse comme le moins important (un non-problème en fait). Je pense que pour les boucles sont surexploitées et je suis en train d'apprendre à utiliser uniquement pour les boucles, lorsqu'elles sont nécessaires et non pas comme une solution par défaut.
- Je ne dis pas de performance ou asymptotique des avantages. Plutôt de dire qu'en écrivant moins de code, et à l'aide des fonctions de la bibliothèque plutôt que de réinventer la roue-je réduire le bug de la surface(Lignes de Code), tout en augmentant la lisibilité. Deux bonnes choses, je suis sûr que vous serez d'accord.
- Ce sont de bonnes choses, mais ils ne suivent pas toujours de l'aide des fonctions de la bibliothèque. Ce que les gens ont à vous dire, c'est que l'utilisation inappropriée des fonctions de la bibliothèque (par exemple, "en évitant les boucles à tout prix") peut diminuer la lisibilité, augmenter le bug de la surface [*], et de faire votre demande catastrophiquement lent. [ Les bibliothèques peuvent avoir des bugs trop!]
- C , Oh certes, je suis complètement d'accord avec une chose que vous venez de dire! Quand je dis "éviter les boucles à tout prix", j'exagère ma position un peu pour l'effet dramatique. Pour les boucles sont nécessaires et bon, mais je ne vois une surutilisation dans mon code et d'autres. Je ne fais qu'essayer d'améliorer mon style.
- pour l'affichage des années plus tard.Je trouve cette question de manière appropriée. Si elle est insérée dans une méthode, les arguments doivent être testés (times>=0), les erreurs jeté etc.Cela ajoute de la robustesse, mais aussi des lignes de code à lire. Répéter une chaîne de caractères est quelque chose d'équivoque.Qui lit le code sait exactement ce qu'est une chaîne de caractères.répétez le fait, même sans une ligne de commentaire ou de javadoc.Si nous utilisons un stable de la bibliothèque, est raisonnable de penser qu'une simple fonction n'a pas de bugs,MAIS introduit une certaine forme de "robustesse" de vérifier que nous avons encore besoin de s'inquiéter.Si je pouvais demander 10 améliorations, ce (genre de) les choses seraient un.
- En regardant en arrière à cette question, je me rends compte d'un problème de plus avec des boucles for. Ils spécifier l'ordre dans lequel les actions doivent être effectuées lorsque la plupart du temps, l'ingénieur ne veut effectuer une action sur chaque élément d'une liste (quel que soit l'ordre). Cette dépendance de l'ordre rend beaucoup plus difficile pour les compilateurs pour paralléliser le code. Je pense que le python fonction map a droite de celui-ci: docs.python.org/library/functions.html#map
- Soulève pitchfork en total accord. "Mort pour la boucle, longue vie à la lisibilité"!
- une bonne raison pour éviter les boucles, c'est que java a déjà introduit des itérateurs à la seule portée de soulager les boucles de déclaration.Il a été un lourd effort à cette fin.L'amélioration de la Chaîne de l'API un peu permettrait l'élimination complète de "évident" boucles de code à un coût très faible.Et une beaucoup plus grande (encore sous-estimés) des prestations.Le temps qu'il faut pour comprendre le plus simple boucle est beaucoup plus grande que le temps passé dans la lecture de "répéter" mot. String[] x = {"pensez?", "vous", "ne"}; for (int i=x.longueur-1;i>=0;i--) { System.out.println(x[i]); }
- l'ordre la question est correct, mais je pense que vous ne pouvez pas tourner à un langage procédural dans déclaratif à un "au cas où". Je ne sais pas si vous vous sentez détendu lors de l'itération de la collection et la suppression de certains d'entre eux parce que "vous ne voulez effectuer une action sur chaque élément de" partir à la mise en œuvre de bibliothèque "de ne pas faire de gâchis". Peut-être l'étude de l'API plus en profondeur. Si vous n'avait pas le temps, vous avez probablement choisir une preuve de l'échec approche procédurale comme un downto-retrait 🙂
- cependant, je pense que plusieurs de ces raisons sont assez "strict". peut-être assez pour commencer une JCP demande. ne serait-il pas merveilleux?
- "Intelligents" code doit être évitée.
for
boucles ne devrait pas. Rendre le code à faire ce à quoi il ressemble, et d'utiliser plusieurs lignes si nécessaire. Votre compilateur va faire tout petit et astucieux - hors de la vue. - code devrait être évité, je suis d'accord. Mais pour les boucles sont "intelligents" code que vous avez tout juste d'être utilisé pour eux. Considérer que la boucle for s'appuie sur une relation mathématique entre la façon dont nous stocker des chaînes de caractères dans les tableaux (assez arbitraire, dépend de la machine au choix) et une périodiquement l'augmentation de nombre entier. Avant de vous êtes en désaccord essayez d'expliquer comment vous pouvez vous répéter une chaîne à l'aide de boucles' à un non-programmeur.
- va ici: "nous magasin de la chaîne comme une liste de personnages, chacun dans une boîte numérotée. Si j'ai besoin d'une chaîne de caractères qui est de 100 de long, j'ai mis un personnage en zone 1, zone 2, tout le chemin jusqu'à me rendre à la boîte de 100. Puis-je arrêter d'ajouter des caractères. "Que semble décrire la boucle assez bien. J'ai décidé de ne pas expliquer le "décalage de zéro", car c'est pas pertinente pour l'explication de la non-programmeur.
- Si vous êtes sur Java 11, vous pouvez utiliser
String::repeat
- voir cette réponse.
Vous devez vous connecter pour publier un commentaire.
De Java 11, il y a une méthode
String::repeat
qui fait exactement ce que vous avez demandé:Sa Javadoc dit:
"abc".repeat(3)
Ici est la version la plus courte (Java 1.5+ requis):
Où
n
est le nombre de fois que vous voulez répéter la chaîne ets
est la chaîne de répéter.Pas les importations ou les bibliothèques nécessaires.
char[]
, dans ce cas) sont instanciés avec les valeurs null, puis unString
est créé à partir de lachar[]
, et les valeurs null sontreplaced()
avec le caractère que vous voulez danss
...replace('\0', str)
doit être utilisé au lieu de la version de Chaîne.replace(char oldChar, char newChar)
etreplace(CharSequence target, CharSequence replacement)
donc je ne vois pas comment cela pourrait fonctionnerInteger.toString(Math.pow(10, n)).replace("1", "").replace("0", str);
ou ceInteger.toBinaryString(Math.pow(2, n)).replace("1", "").replace("0", str);
NE PAS l'utiliser pour le grand nombre lolwhile(repeat-- > 0) { sb.apend(word)}
\0
fin de délimiteur de chaîne a été ressuscité d'entreC
? Quelles sont les autres applications utiles dansjava
?char
, c'est le 0 caractères. Nous n'avons tout simplement un remplaçant à chaque occurrence de ce caractère.Commons Lang StringUtils.répéter()
Utilisation:
StringUtils
dans nos projets.Si vous utilisez Java <= 7, c'est aussi simple que cela:
Dans Java 8 et au-dessus il y a un moyen simple:
Java 11 ajouté une nouvelle
repeat(int count)
méthode spécifiquement pour cette(lien)n
est égale à zéro.Char
s
avec"" + s
alors qu'il allait travailler avec unchar
ouString
ouint
.Java 8
String.join
fournit un bon moyen de ce faire en collaboration avecCollections.nCopies
:Ici un moyen de le faire en utilisant uniquement des fonctions de chaînes de caractères et non explicite boucles:
replaceAll
replace()
. En Java 1.5+, il y a une version surchargée dereplace()
qui prend deuxCharSequence
s (qui comprennentString
s): download.oracle.com/javase/1.5.0/docs/api/java/lang/...n=3
: il formate d'abord une chaîne à ressembler à quelque chose comme%03d
(%%
est de s'échapper du signe de pourcentage), qui est la mise en forme de code à ajouter 3 remplissage de zéros, puis formats0
avec qui, conduisant à000
, et enfin remplace chaque0
avec les cordesSi vous êtes comme moi et que vous voulez utiliser Google Goyave et pas Apache Commons. Vous pouvez utiliser le répétez méthode dans la Goyave, les Chaînes de la classe.
Avec java-8, vous pouvez également utiliser
Stream.generate
.et vous pouvez l'envelopper dans un utilitaire simple méthode, si nécessaire:
return IntStream.range(0, times).mapToObj(i -> str).collect(joining());
qui parallelizes mieuxDonc, vous voulez éviter les boucles?
Ici, vous l'avez:
(bien sûr, je sais que c'est laid et inefficace, mais il n'a pas de boucles :-p)
Vous voulez qu'il est plus simple et plus jolie? utilisation jython:
Modifier: il faut optimiser un peu 😀
Edit2: j'ai fait un rapide et sale de référence pour les 4 principales solutions de rechange, mais je n'ai pas de temps pour l'exécuter plusieurs fois pour obtenir les moyens et l'intrigue à la fois pour plusieurs entrées... Donc voici le code si quelqu'un veut l'essayer:
Il prend 2 arguments, le premier est le nombre d'itérations (chaque fonction exécuter avec la répétition fois arg à partir de 1..n) et la deuxième est la chaîne de répéter.
Jusqu'à présent, une rapide inspection de la fois en cours d'exécution avec des entrées différentes feuilles du classement à quelque chose comme ceci (meilleur au pire):
Je n'auriez jamais deviné que la fonction récursive a été plus rapide que le
for
boucle 😮Avoir du plaisir(fonctionnelle xD).
Il contient moins de caractères que votre question
commons-lang3.3.1-sources
et vous ne serez pas aussi bien plus 😉 Mais si quelqu'un a déjàcommons-lang
, j'ai l'appui de votre réponse."nullnullnullnull"
pour(null, 4)
...null
comme"null"
(comme le StringBuilder déjà fait). Sinon, la bonne chose à faire est de jeter un NPE. Si l'appelant passe déchets d'entrée, qui n'est pas raisonnable de sortie, c'est juste qu'ils devraient recevoir de déchets jetés à eux.repeat
d'interdire l'utilisation de null et le plantage de votre programme si vous le faites? De retournull
lors d'unenull
est la façon la plus neutre pour gérer cette entrée.basé sur fortran réponse, c'est un recusive version qui utilise un StringBuilder:
à l'aide de Dollar est très simple:
PS: répéter marche aussi pour les array, List, Set, etc
Je voulais une fonction pour créer une liste délimitée par des virgules, de points d'interrogation pour JDBC fins, et trouvé ce post. Alors, j'ai décidé de prendre deux variantes et de voir où l'on fait de mieux. Après 1 million d'itérations, le jardin-variété StringBuilder a pris 2 secondes (fun1), et de l'énigmatique soi-disant plus optimal version (fun2) a pris 30 secondes. Quel est le point de l'être cryptique de nouveau?
OOP Solution
Presque chaque réponse propose une fonction statique comme une solution, mais la pensée de l'Orienté Objet (pour la réutilisabilité et la clarté), je suis venu avec une Solution via la Délégation par le CharSequence-Interface (qui ouvre également la facilité d'utilisation sur mutable CharSequence-Classes).
La Classe suivante peut être utilisée avec ou sans Séparateur de Chaîne/CharSequence et chaque appel à "toString ()", développe la finale répétées de la Chaîne.
L'Entrée/Séparateur ne sont pas seulement limités à la Chaîne de Classe, mais il peut être chaque Classe qui implémente CharSequence (par exemple StringBuilder, StringBuffer, etc)!
De Code Source:
D'Utilisation-Exemple:
Exemple-Sortie:
en utilisant uniquement JRE classes (Système.arraycopy) et en essayant de minimiser le nombre de temp objets que vous pouvez écrire quelque chose comme:
MODIFIER
et sans boucles, vous pouvez essayer de:
EDIT 2
à l'aide de Collections est encore plus court:
cependant, j'aime toujours la première version.
replace
catastrophiquement cassé, parce qu'ils supprimer tous les crochets et la virgule-espace des séquences dans les entrées. Votre base de boucle version est très bien, bien que la valeur d'entrée de la coercition est un peu douteuses, et vous pourriez éviter d'appelertoCharArray()
à l'aide deString.getChars
.Si la vitesse est votre préoccupation, alors vous devriez utiliser le moins de mémoire de la copie que possible. Ainsi, il est nécessaire de travailler avec des tableaux de caractères.
Afin de tester la vitesse, une semblable méthode optimale à l'aide de StirngBuilder est comme ceci:
et le code pour le tester:
Et voici les résultats de mon système:
Noter que le test de la boucle coup de pied dans JIT et avoir des résultats optimaux.
par souci de lisibilité et de la portabilité:
Pas le plus court, mais (je pense) le moyen le plus rapide est d'utiliser la classe StringBuilder:
Si vous êtes inquiet au sujet de la performance, il suffit d'utiliser un StringBuilder l'intérieur de la boucle et faire un .toString() à la sortie de la Boucle. Heck, écrire votre propre Util Classe et de le réutiliser. 5 Lignes de code max.
J'ai vraiment plaisir à cette question. Il y a beaucoup de connaissances et de styles. Donc je ne peux pas la laisser sans montrer mon rock and roll 😉
Vous aimez?
Simple boucle
times
à StringBuilder constructeur.Essayez ceci:
En utilisant la récursivité, vous pouvez effectuer les opérations suivantes (à l'aide d'opérateurs ternaires, une ligne max):
Je sais, c'est moche et n'est probablement pas efficace, mais c'est une ligne!
Malgré votre désir de ne pas utiliser de boucles, je pense que vous devriez utiliser une boucle.
Vos raisons pour ne pas utiliser une boucle for ne sont pas bons. En réponse à vos critiques:
repetitions = -5
. b) télécharger Commons Lang et exécuterrepeatString('a', 1000)
un million de fois dans une boucle; faire de même avec votre code; comparer la fois. Pour le crédit supplémentaire de faire la même chose avecrepeatString('ab', 1000)
.StringUtils.repeat("ab",1000)
? Parce que c'était ma réponse que vous avez downvoted. Il effectue également de mieux et n'a pas de bugs.voici la dernière Stringutils.java StringUtils.java
il n'a même pas besoin d'être aussi grande, peut être fait dans ce, et peut être copié et collé
dans une classe utilitaire dans votre projet.
Donc e5, je pense que la meilleure façon de le faire serait d'utiliser simplement le code mentionné ci-dessus,ou l'un quelconque des réponses ici. mais commons lang est tout simplement trop gros si c'est un petit projet
J'ai créé une méthode récursive qui font la même chose que vous voulez.. n'hésitez pas à utiliser ce...
j'ai la même réponse sur Je peux multiplier les chaînes de caractères en java pour la répétition des séquences?
StringBuilder
à la place.Parfois simple est le meilleur. Tout le monde de lire le code peut voir ce qui se passe.
Et le compilateur ne la fantaisie avec
StringBuilder
derrière les coulisses pour vous.