Lorsque vous devez parcourir une collection et créer une chaîne de chaque donnée séparée par un délimiteur, vous vous retrouvez toujours avec un délimiteur supplémentaire à la fin, par exemple
for (String serverId : serverIds) {
sb.append(serverId);
sb.append(",");
}
Donne quelque chose comme: serverId_1, serverId_2, serverId_3,
Je voudrais supprimer le dernier caractère du StringBuilder (sans le convertir car j'en ai toujours besoin après cette boucle).
java
stringbuilder
Matthieu
la source
la source
StringJoiner
: stackoverflow.com/a/29169233/901641Réponses:
D'autres ont souligné la
deleteCharAt
méthode, mais voici une autre approche alternative:Sinon, utilisez la
Joiner
classe de Guava :)Depuis Java 8,
StringJoiner
fait partie du JRE standard.la source
Joiner
trop dans leurStringUtils
. commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/… , java.lang.String)Une autre solution simple est:
Une solution plus compliquée:
La solution ci-dessus suppose que
sb.length() > 0
... c'est-à-dire qu'il y a un "dernier caractère" à supprimer. Si vous ne pouvez pas faire cette hypothèse, et / ou vous ne pouvez pas traiter l'exception qui se produirait si l'hypothèse est incorrecte, vérifiez d'abord la longueur du StringBuilder; par exempleou
la source
la source
sb.length() == 0
aussiseparator.length()
au lieu de 1.Depuis Java 8, la classe String possède une méthode statique
join
. Le premier argument est une chaîne que vous voulez entre chaque paire de chaînes, et le second est unIterable<CharSequence>
(qui sont les deux interfaces, donc quelque chose comme çaList<String>
fonctionne. Donc vous pouvez simplement faire ceci:Toujours en Java 8, vous pouvez utiliser la nouvelle
StringJoiner
classe, pour les scénarios où vous souhaitez commencer à construire la chaîne avant d'avoir la liste complète des éléments à y mettre.la source
String.join
au lieu deStringJoiner
.Obtenez simplement la position de la dernière occurrence de caractère.
Depuis
lastIndexOf
effectuera une recherche inversée, et vous savez qu'il trouvera au premier essai, les performances ne seront pas un problème ici.ÉDITER
Puisque je continue de me lever sur ma réponse (merci les gens 😊), cela vaut la peine de le noter:
Sur Java 8 , il serait juste plus lisible et explicite d'utiliser StringJoiner . Il a une méthode pour un simple séparateur et une surcharge pour le préfixe et le suffixe.
Exemples tirés d'ici: exemple
Exemple utilisant un simple séparateur:
Production:
Exemple avec suffixe et préfixe:
Production
la source
,
car il s'agissait de la dernière instruction dufor loop
. C'estlastInfexOf
plus pour la lisibilité et pour en faire une évidence si vous ne voulez pas vous souvenir s'il est indexé 0 ou non. De plus, vous n'avez pas besoin de vous mêler de la longueur du constructeur de cordes. C'est juste pour la commodité.Dans ce cas,
est préférable car il attribue simplement la dernière valeur à
'\0'
tandis que la suppression du dernier caractère neSystem.arraycopy
la source
setLength
appel n'affecte rien à la dernière valeur. Les tampons de chaîne Java ne se terminent pas par zéro / zéro. En fait, ilsetLength
s'agit simplement de mettre à jour unlength
champ.arraycopy
éléments copiés 0, donc je suppose que cela peut être optimisé.Avec
Java-8
vous pouvez utiliser une méthode statique deString
classe,String#join(CharSequence delimiter,Iterable<? extends CharSequence> elements)
.PRODUCTION
la source
Une autre alternative
la source
Alternativement,
la source
la source
Encore une autre alternative:
la source
Pour éviter de réinitier (affecter les performances) d'
prefix
utilisation TextUtils.isEmpty:la source
Vous pouvez essayer d'utiliser la classe «Joiner» au lieu de supprimer le dernier caractère de votre texte généré;
la source
Je fais quelque chose comme ci-dessous:
la source
Voici une autre solution:
la source
Personnellement, j'aime ajouter un caractère de retour arrière (ou plus pour un "délimiteur" plus long) à la fin:
Notez qu'il a des problèmes:
\b
est affiché dépend de l'environnement,length()
duString
contenu peut être différent de la longueur des caractères « Visibile »Lorsque cela
\b
semble OK et que la longueur n'a pas d'importance, comme la connexion à une console, cela me semble assez bon.la source
stringBuilder.Remove (stringBuilder.Length - 1, 1);
la source