Comment puis-je ajouter un String en Java?
Est-il un moyen facile de tampon de Chaînes de caractères en Java?
Semble comme quelque chose qui devrait être dans certains StringUtil-comme l'API, mais je ne peux pas trouver quelque chose qui fait cela.
- Sur la question de l'apache fonction de vs la chaîne de formatage, il y a peu de doute que l'apache fonction est plus clair et facile à lire. Emballage le formateur en fonction des noms n'est pas l'idéal.
Vous devez vous connecter pour publier un commentaire.
Apache
StringUtils
a plusieurs méthodes:leftPad
,remplissagedroite
,center
etrepeat
.Mais s'il vous plaît noter que, comme d'autres l'ont mentionné et illustré dans cette réponse —
String.format()
et laFormatter
les classes du JDK sont de meilleures options. Utiliser sur les communes de code.StringUtils
/Strings
est toujours le meilleur choix de l'OMI, lorsque la taille du tampon est une variable d'exécution.Depuis Java 1.5,
String.format()
peut être utilisé à gauche/droite pad d'une chaîne donnée.Et la sortie est:
1$
pour? @leo a fait très semblable à la réponse qui n'utilise pas1$
et apparemment, elle a le même effet. Fait-il une différence?:P
Même alors, il sert pratiquement pas utiliser dans ce cas, je suppose.n
doit être supérieure à0
.1$
car il n'est pas nécessaire et les causes de la confusion dans d'autres exemples, c'est à dire que si vous formatez un modèle avec plusieurs paramètres.String.format("%5s", valueString)
fonctionne tout aussi bien pour leftPad une chaîne d'une longueur de 5 par exemple.String.format("%5d", valueInt)
serait garniture gauche d'un nombre à une longueur de 5. Comme d'autres l'ont souligné, la numérotation des arguments est facultatif.Rembourrage de 10 caractères:
de sortie:
Affichage '*' pour les caractères de mot de passe:
sortie a la même longueur que la chaîne de mot de passe:
.replace(' ', '*')
était plutôt destiné à montrer l'effet de rembourrage. Le mot de passe de cacher l'expression de ne pas avoir ce problème de toute façon... Pour une meilleure réponse sur la personnalisation de la gauche et droit de la chaîne de remplissage à l'aide de Java en natif fonctionnalité de voir mon autre réponse.String.format("%30s", "pad left").replaceAll("(?<=( |^)) ", "*")
ouString.format("%-30s", "pad right").replaceAll(" (?=( |$))", "*")
Dans Goyave, c'est facile:
Quelque chose de simple:
La valeur doit être une chaîne de caractères. convertir en string, si elle ne l'est pas. Comme
"" + 123
ouInteger.toString(123)
Sous-chaîne de commencer à partir de la valeur de la longueur indice de char jusqu'à la fin de la longueur de collier:
Plus précis
pavé droit:
pad gauche:
Ont un coup d'oeil à
org.apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar)
.Mais l'algorithme est très simple (pavé de droite jusqu'à la taille des caractères):
Outre Apache Commons, voir aussi
String.format
qui doit être en mesure de prendre soin de simple remplissage (par exemple, avec des espaces).str
, donc c'est correct.(length - str.length())
est0
? Le formateur jette unFormatFlagsConversionMismatchException
quand%0s
est la chaîne de format.Ce qui m'a pris un peu de temps à comprendre.
La vraie clé est de lire que Formateur de la documentation.
je sais que ce fil est une sorte de vieux et de la question d'origine était une solution de facilité, mais si c'est censé être vraiment rapide, vous devez utiliser un tableau de char.
le formateur solution n'est pas optimale. juste la construction de la chaîne de format crée 2 nouvelles chaînes.
apache solution peut être améliorée par l'initialisation de la sb avec la taille de la cible afin de remplacer ci-dessous
avec
permettrait d'éviter le sb de la mémoire tampon interne de plus en plus.
StringBuffer
ne peut pas être accédé par plusieurs threads à la fois (ce qui dans ce cas est vrai), vous devez utiliser unStringBuilder
(en JDK1.5+) pour éviter la surcharge de la synchronisation.Ici est une autre façon de pad à droite:
Vous pouvez réduire le nombre d'appels généraux en conservant les données de remplissage, plutôt que de reconstruire à chaque fois:
Comme alternative, vous pouvez rendre le résultat de longueur d'un paramètre à la
pad(...)
méthode. Dans ce cas, faire le réglage de l'caché rembourrage dans cette méthode, au lieu de dans le constructeur.(Astuce: Pour un crédit supplémentaire, faire thread-safe! 😉
Trouvé ceci sur Dzone
Pad avec des zéros:
vous pouvez utiliser le construit en StringBuilder append() et l'insert() les méthodes, les
pour le rembourrage de la variable longueur de chaîne:
Par Exemple:
Cela fonctionne:
Il remplira votre Chaîne XXX jusqu'à 9 Caractères avec un espace. Après que tous les Espaces sera remplacé par un 0. Vous pouvez modifier l'espace et le 0 pour tout ce que vous voulez...
static
méthodeString.format(…)
au lieu d'abuser d'une chaîne vide. Sauver quatre caractères dans le code source n'est sûrement pas la peine de la perte de lisibilité.Me laisser une réponse à certains des cas que vous avez besoin pour donner à gauche/droite de rembourrage (ou préfixe/suffixe ou des espaces) avant de concaténer à l'autre de la chaîne et vous ne voulez pas tester la longueur ou de tout si la condition.
Le même à la réponse choisie, je préfère le
StringUtils
de Apache Commons, mais à l'aide de cette façon:Expliquer:
myString
: la chaîne I de l'entrée, peut être nullStringUtils.leftPad(myString, 1)
: si la chaîne est nulle, cette déclaration serait de retour null tropdefaultString
de donner une chaîne vide pour éviter concaténer null@ck's et @Marlon Tarakreponses sont les seuls à utiliser un
char[]
, qui pour les applications qui ont plusieurs appels à rembourrage méthodes par seconde est la meilleure approche. Cependant, ils ne prennent pas avantage de n'importe quel tableau de manipulation et optimisations sont un peu écrasées à mon goût, ce qui peut être fait avec pas de boucles à tous les.Simple méthode de test:
Sorties:
getChars
pour leString
copier son contenu directement dans laout
tableau, au lieu d'appelersource.toCharArray()
, suivie parSystem.arraycopy
. J'irais même jusqu'à envisager de simplifier la mise en œuvre dechar[] out = new char[length]; Arrays.fill(out, 0, length, fill); source.getChars(0, source.length(), out, right? 0: length - source.length()); return new String(out);
; tout cela ressemble àfill
permettrait de faire plus de travail, il permet en fait de la JVM pour éliminer le défaut à zéro de remplissage.java.util.Formatter
fera à gauche et à droite de rembourrage. Pas besoin de bizarre tiers des dépendances (voudriez-vous ajouter quelque chose de tellement banal).[J'ai laissé de côté les détails et fait ce post 'wiki de la communauté", car il n'est pas quelque chose que j'ai besoin d'.]
Utiliser cette fonction.
comment l'utiliser?
de sortie:
01 02 03 04 .. 11 12
Beaucoup de gens ont quelque chose de très intéressant techniques, mais j'aime garder les choses simples je pars donc avec ceci :
Depuis Java 11, Chaîne.répéter(int) peut être utilisé à gauche/droite pad d'une chaîne donnée.
De sortie:
Une solution simple sans aucune API sera comme suit:
Java oneliners, pas de fantaisie, de la bibliothèque.
Pad Gauche, ne se limite pas
Pavé Droit, n'a pas de limite
Pad Gauche, limite pad longueur
Pad à Droite, limite à la pad longueur
Tous chaîne opération a généralement besoin d'être très efficace - surtout si vous travaillez avec de grands ensembles de données. Je voulais quelque chose de rapide et souple, similaire à ce que vous obtenez en plsql pavé de commande. Aussi, je ne veux pas d'inclure un énorme lib pour juste une petite chose. Avec ces considérations, aucune de ces solutions ont été satisfaisants. C'est la solutions je suis venu avec, qui avait le meilleur bench-marking résultats, si quelqu'un peut l'améliorer, s'il vous plaît ajouter votre commentaire.
Une solution simple serait:
Comment est-ce
Chaîne "bonjour" et requis le rembourrage est de 15 "0" à gauche pad