Existe-t-il un moyen en java de créer une chaîne avec un nombre spécifié d'un caractère spécifié? Dans mon cas, j'aurais besoin de créer une chaîne de 10 espaces. Mon code actuel est:
StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
outputBuffer.append(" ");
}
return outputBuffer.toString();
Y a-t-il une meilleure façon d'accomplir la même chose? En particulier, j'aimerais quelque chose de rapide (en termes d'exécution).
java
string
stringbuffer
Traverser
la source
la source
append(' ')
place ... cela implique un peu moins de calcul ...Réponses:
La boucle for sera optimisée par le compilateur. Dans des cas comme le vôtre, vous n'avez pas besoin de vous soucier de l'optimisation par vous-même. Faites confiance au compilateur.
BTW, s'il existe un moyen de créer une chaîne avec n caractères d'espace, elle est codée de la même manière que vous venez de le faire.
la source
static Dictionary<int, String>
?" ".substring(0, 10);
Probablement le code le plus court utilisant l'
String
API, exclusivement:En tant que méthode, sans instancier directement
char
:Appeler en utilisant:
la source
Hmm maintenant que j'y pense, peut-être
Arrays.fill
:Bien sûr, je suppose que la
fill
méthode fait la même chose que votre code, donc elle fonctionnera probablement à peu près de la même manière, mais au moins, il y a moins de lignes.la source
Arrays.fill()
fonction est utilisée de manière cohérente pour effectuer ce travail dans votre code et dans le code de la bibliothèque (standard et externe), elle constitue un bon candidat pour la compilation Hotspot et a de meilleures chances de trouver le cache de votre processeur. Les futures machines virtuelles Java peuvent l'attribuer en tant que fonction intrinsèque . Rouler vous-même vous coupe de toute cette bonté de performance ...Je suggère fortement de ne pas écrire la boucle à la main. Vous ferez cela encore et encore au cours de votre carrière en programmation. Les personnes qui lisent votre code - vous y compris - doivent toujours investir du temps, même si ce ne sont que quelques secondes, pour digérer le sens de la boucle.
Au lieu de cela, réutilisez l' une des bibliothèques disponibles fournissant du code qui fait exactement cela comme
StringUtils.repeat
dans Apache Commons Lang :De cette façon, vous n'avez pas non plus à vous soucier des performances, donc tous les détails sanglants des
StringBuilder
optimisations du compilateur, etc. sont cachés. Si la fonction s'avérait aussi lente, ce serait un bogue de la bibliothèque.Avec Java 11, cela devient encore plus simple:
la source
Dans Java 8, vous pouvez utiliser
String.join
:la source
Si vous ne voulez que des espaces, que diriez-vous:
ce qui se traduira par des espaces abs (n);
la source
depuis Java 11 :
depuis Java 8 :
où:
la source
Depuis Java 11, vous pouvez simplement utiliser
String.repeat(count)
pour résoudre votre problème.Donc, au lieu d'une boucle, votre code ressemblerait à ceci:
la source
Je pense que c'est le moins de code possible, il utilise la classe Guava Joiner:
la source
pubic String n(int n) { ... }
qui permettra encore "moins" de code:,n(10)
mais encore une fois, cela n'a aucun sens.Vous pouvez utiliser la
String.format
fonction standard pour générer N espaces. Par exemple:Crée une chaîne de 5 espaces.
ou
Donne une chaîne de 15 barres d'espace.
Si vous souhaitez qu'un autre symbole se répète, vous devez remplacer les espaces par le symbole souhaité:
Production:
la source
Ma contribution basée sur l'algorithme d'exponentiation rapide.
J'ai testé l'algorithme par rapport à deux autres approches:
String.concat()
pour concaténer une chaîneStringBuilder
Code de test (concaténation utilisant une boucle for et
String.concat()
devientn
trop lente pour un grand , donc je l'ai laissé de côté après la 5ème itération).Résultats:
Conclusion:
n
- utilisez l'approche récursiven
- la boucle for a une vitesse suffisantela source
if
déclarations vont gâcher la prédiction de branche du CPU. Cela devrait vraiment être refait à l'aide de JMH ( openjdk.java.net/projects/code-tools/jmh ), sinon c'est un peu inutile.Que dis-tu de ça?
la source
Considérant que nous avons:
Java 8 (en utilisant Stream)
Java 8 (avec nCopies)
la source
Collectors.joining(EMPTY_STRING)
équivaut àCollectors.joining()
RandomStringUtils a une disposition pour créer une chaîne à partir d'une taille d'entrée donnée. Je ne peux pas faire de commentaire sur la vitesse, mais c'est une ligne unique.
crée une sortie
préférable si vous ne voulez pas voir \ 0 dans votre code.
la source
Utilisez StringUtils: StringUtils.repeat ('', 10)
la source
Dans la plupart des cas, vous n'avez besoin que de chaînes jusqu'à une certaine longueur, disons 100 espaces. Vous pouvez préparer un tableau de chaînes où le numéro d'index est égal à la taille de la chaîne remplie d'espace et rechercher la chaîne, si la longueur requise est dans les limites ou la créer à la demande si elle est en dehors de la limite.
la source
La solution la plus courte avec Guava:
Via un moyen simple de répéter une chaîne en java .
la source
Remplacez simplement votre StringBuffer par un StringBuilder . Difficile de battre ça.
Si votre longueur est un grand nombre, vous pouvez implémenter un auto-ajout plus efficace (mais plus maladroit), en dupliquant la longueur à chaque itération:
Vous pouvez également essayer l '
Arrays.fill()
approche ( réponse de FrustratedWithFormsDesigner ).la source
Vous pouvez remplacer
StringBuffer
parStringBuilder
(ce dernier n'est pas synchronisé, peut être plus rapide dans une seule application de thread)Et vous pouvez créer l'
StringBuilder
instance une fois, au lieu de la créer chaque fois que vous en avez besoin.Quelque chose comme ça:
Et utilisez-le comme ceci:
Si vous conservez votre
createA
comme variable d'instance, vous pouvez gagner du temps en créant des instances.Ce n'est pas thread-safe, si vous avez plusieurs threads, chaque thread doit avoir sa propre copie.
la source
Pour de bonnes performances, combinez les réponses d' aznilamir et de FrustratedWithFormsDesigner
Ajustez la taille de en
BLANKS
fonction de vos besoins. MaBLANKS
chaîne spécifique est d'environ 200 caractères.la source
Ayez une méthode comme celle-ci. Cela ajoute les espaces requis à la fin de la donnée
String
pour donner uneString
longueur donnée à une longueur spécifique.la source
Vous voulez que la chaîne soit de taille fixe, de sorte que vous remplissiez ou tronquiez, pour tabuler les données ...
Excellente référence ici .
la source
Cela a fonctionné pour moi sans utiliser de bibliothèques externes dans Java 8
Et la sortie est
la source
int c = 10; Espaces de chaîne = String.format ("%" + c + "c", ''); cela résoudra votre problème.
la source
Une méthode simple comme ci-dessous peut également être utilisée
la source
que dis-tu de ça?
EDIT: j'ai écrit un code simple pour tester le concept et voici ce que j'ai trouvé.
Méthode 1: ajouter un seul espace dans une boucle:
Méthode 2: ajoutez 100 espaces et boucle, puis sous-chaîne:
Le résultat que j'obtiens en créant 12345678 espaces:
et pour 10 000 000 places:
combiner l'allocation directe et l'itération prend toujours moins de temps, en moyenne 60 ms de moins lors de la création de grands espaces. Pour les plus petites tailles, les deux résultats sont négligeables.
Mais veuillez continuer à commenter :-)
la source
Je ne connais aucune méthode intégrée pour ce que vous demandez. Cependant, pour une petite longueur fixe comme 10, votre méthode devrait être très rapide.
la source