Créer une chaîne de n caractères
Est-il un moyen en java pour créer une chaîne avec un nombre spécifié de caractères spécifié? Dans mon cas, j'aurais besoin de créer une chaîne de 10 places. Mon code actuel est:
StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
outputBuffer.append(" ");
}
return outputBuffer.toString();
Est-il une meilleure façon d'accomplir la même chose. En particulier, je voudrais quelque chose qui est rapide (en termes d'exécution).
- Si vous vous retrouver à faire beaucoup, il suffit d'écrire une fonction: Chaîne de characterRepeat(Char c, int Longueur){ ... } qui correspond à ce que vous faites là, pour n'importe quel caractère et de toute longueur. Puis il suffit de l'appeler quand vous en avez besoin.
- vous souhaitez utiliser StringBuilder au lieu de StringBuffer
- Ajouter au début de la taille de la mémoire tampon, il est facile de calculer une facilite les choses en mémoire managemnt!. StringBuilder outputBuffer = new StringBuilder(répéter * de la base.length());
- Voir aussi: stackoverflow.com/questions/1235179/...
- Si vous voulez ajouter un espace unique, l'utilisation
append(' ')
à la place... ça implique un peu moins de l'informatique... - Java 8 : Flux et nCopies - stackoverflow.com/a/51925748/1216775
Vous devez vous connecter pour publier un commentaire.
Pour la boucle sera optimisé par le compilateur. Dans de tels cas comme le vôtre, vous n'avez pas besoin de se soucier de l'optimisation sur votre propre. La confiance du compilateur. 🙂
Edit: Btw, si il existe un moyen de créer une chaîne de n caractères d'espace, que c'est codé de la même façon comme tu l'as fait.
static Dictionary<int, String>
?" ".substring(0, 10);
Probablement les plus brefs code à l'aide de la
String
API, exclusivement:Comme une méthode, sans en faire directement l'instanciation de
char
:Appeler à l'aide:
Hmm maintenant que j'y pense, peut-être
Tableaux.remplissez
:Bien sûr, je suppose que le
fill
méthode fait la même chose que votre code, donc il va probablement effectuer sur le même, mais au moins c'est moins de lignes.Arrays.fill()
fonction est utilisée pour faire ce travail à travers votre code et (standard et externe) code de la bibliothèque, puis il fait un bon candidat pour Hotspot de la compilation, et a plus de chance d'être trouvé votre cache du PROCESSEUR. L'avenir Jvm peut le définir comme un intrinsèques de la fonction. Rouler vos propres coupes de toutes ces performances bonté...Je vous suggère fortement de ne pas écrire la boucle à la main.
Vous pourrez le faire plus et plus encore, au cours de votre programmation de carrière.
Les gens de la lecture de votre code - vous de toujours avoir à investir du temps, même si ce sont juste quelques secondes, pour digérer le sens de la boucle.
Au lieu réutilisation l'une des bibliothèques de la fourniture du code qui ne fonctionne tout simplement que, comme
StringUtils.repeat
de Apache Commons Lang:De cette façon, vous n'avez pas à vous soucier de la performance, ainsi tous les détails sanglants de la
StringBuilder
, optimisations du Compilateur, etc. sont cachés.Si la fonction ferait que ralentir ce serait un bug de la bibliothèque.
Avec Java 11 il devient encore plus facile:
Dans Java 8, vous pouvez utiliser
String.join
:Si vous ne souhaitez que des espaces, alors que diriez-vous:
qui se traduira en abs(n) des espaces;
Je pense que c'est le moins de code possible, il utilise la Goyave Menuisier classe:
pubic String n(int n) { ... }
qui permettra même "moins" code:n(10)
, mais encore une fois, n'a aucun sens.Ma contribution basée sur l'algorithme d'exponentiation rapide.
J'ai testé l'algorithme à l'encontre de deux autres approches:
String.concat()
pour concaténer des chaînesStringBuilder
Le code de Test (concaténation à l'aide d'une boucle for et
String.concat()
devient lent pour les grandesn
, donc je l'ai laissée après la 5ème itération).Résultats:
Conclusion:
n
- utiliser l'approche récursiven
- pour la boucle a une vitesse suffisanteif
états sont sur le point de rater le CPU de la direction de la prévision. Cela devrait vraiment être refaite à l'aide de JMH (openjdk.java.net/projects/code-tools/jmh), sinon c'est un peu inutile.Vous pouvez utiliser les
String.format
fonction pour générer N espaces.Par exemple:
Rend une chaîne de caractères avec 5 espaces.
ou
Rend une chaîne de 15 entretoises.
Si vous voulez un autre symbole pour le répète, vous devez remplacer les espaces avec votre symbole souhaité:
De sortie:
Compte tenu que nous avons:
Java 8 (À L'Aide De Flux)
Java 8 (à l'Aide de nCopies)
Collectors.joining(EMPTY_STRING)
est équivalent àCollectors.joining()
Comment à ce sujet?
RandomStringUtils a une disposition pour créer une chaîne de compte tenu de la taille de l'image.
Cant commentaire sur la vitesse, mais c'est un liner.
crée une sortie
préférable si vous ne voulez pas voir \0 dans votre code.
Utilisation StringUtils:
StringUtils.repeat(' ', 10)
Dans la plupart des cas, vous avez seulement besoin de Chaînes jusqu'à un certains de longueur, de 100 places. Vous pouvez vous préparer un tableau de Chaînes de caractères où le numéro d'index est égal à la taille de l'espace rempli de chaîne et de recherche de la chaîne, si la longueur est dans les limites ou le créer à la demande, si c'est en dehors de la frontière.
Depuis Java 11, vous pouvez simplement utiliser
String.répétition(nombre)
pour résoudre votre problème.Donc au lieu d'une boucle de votre code juste ressembler à ceci:
Il suffit de remplacer votre StringBuffer avec un StringBuilder. Dur à battre.
Si votre longueur est un grand nombre, vous pourriez mettre en œuvre certaines sont plus efficaces
(mais plus maladroit) auto-appendding, de dupliquer la longueur de chaque itération:
Aussi, vous pouvez essayer le
Arrays.fill()
l'approche (FrustratedWithFormsDesigner's réponse).Vous pouvez remplacer
StringBuffer
avecStringBuilder
( ce dernier n'est pas synchronisé, peut s'avérer plus rapide dans un seul thread app )Et vous pouvez créer les
StringBuilder
instance une fois, au lieu de créer à chaque fois que vous en avez besoin.Quelque chose comme ceci:
Et de l'utiliser comme ceci:
Si vous maintenez votre
createA
comme une variable d'instance, vous pouvez gagner du temps en créant des instances.Ce n'est pas thread-safe, si vous avez des multi-threads, chaque thread doit avoir sa propre copie.
Pour une bonne performance, combiner les réponses de aznilamir et de FrustratedWithFormsDesigner
Ajuster la taille de
BLANKS
en fonction de vos besoins. MonBLANKS
chaîne est d'environ 200 caractères de longueur.Ont une méthode de ce genre. Ceci ajoute des locaux à la fin de l'
String
de faire unString
à la longueur de la longueur spécifique.Une méthode simple comme ci-dessous peut également être utilisé
comment à ce sujet?
EDIT: j'ai écrit un code simple pour tester le concept et voici ce que j'ai trouvé.
Méthode 1: ajout d'un espace dans une boucle:
Méthode 2: ajouter 100 places et boucle, puis sous-chaîne:
Le résultat-je obtenir la création d'12,345,678 espaces:
et de 10 000 000 de places:
en combinant l'allocation et l'itération prend toujours moins de temps, en moyenne moins de 60 ms lors de la création des grands espaces. Pour des tailles plus petites, les deux résultats sont négligeables.
Mais s'il vous plaît continuer à commenter 🙂
Je ne connais pas de méthode intégrée pour ce que vous demandez sur. Cependant, pour une petite longueur fixe de 10, votre méthode doit être beaucoup rapide.