Wenn Sie eine Sammlung durchlaufen und aus jedem durch ein Trennzeichen getrennten Datenzeichen eine Zeichenfolge erstellen müssen, erhalten Sie am Ende immer ein zusätzliches Trennzeichen, z
for (String serverId : serverIds) {
sb.append(serverId);
sb.append(",");
}
Gibt etwas wie: serverId_1, serverId_2, serverId_3,
Ich möchte das letzte Zeichen im StringBuilder löschen (ohne es zu konvertieren, da ich es nach dieser Schleife noch brauche).
java
stringbuilder
Matthew
quelle
quelle
StringJoiner
: stackoverflow.com/a/29169233/901641Antworten:
Andere haben auf die
deleteCharAt
Methode hingewiesen , aber hier ist ein anderer alternativer Ansatz:Alternativ können Sie die
Joiner
Klasse von Guava verwenden :)Ab Java 8
StringJoiner
ist Teil der Standard-JRE.quelle
Joiner
auch in ihrStringUtils
. commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/… , java.lang.String)Eine andere einfache Lösung ist:
Eine kompliziertere Lösung:
Die obige Lösung geht davon aus
sb.length() > 0
... dh ein "letztes Zeichen" entfernt werden muss. Wenn Sie diese Annahme nicht treffen können und / oder die Ausnahme nicht behandeln können, die sich ergeben würde, wenn die Annahme falsch ist, überprüfen Sie zuerst die Länge des StringBuilder. z.Boder
quelle
quelle
sb.length() == 0
auchseparator.length()
statt 1.Ab Java 8 verfügt die String-Klasse über eine statische Methode
join
. Das erste Argument ist eine Zeichenfolge, die Sie zwischen jedem Zeichenfolgenpaar haben möchten, und das zweite ist eine ZeichenfolgeIterable<CharSequence>
(beides Schnittstellen, alsoList<String>
funktioniert so etwas wie etwas . Sie können also einfach Folgendes tun:In Java 8 können Sie die neue
StringJoiner
Klasse auch für Szenarien verwenden, in denen Sie mit dem Erstellen der Zeichenfolge beginnen möchten, bevor Sie die vollständige Liste der Elemente zum Einfügen haben.quelle
String.join
anstattStringJoiner
.Holen Sie sich einfach die Position des letzten Zeichenvorkommens.
Da
lastIndexOf
eine umgekehrte Suche durchgeführt wird und Sie wissen, dass diese beim ersten Versuch gefunden wird, ist die Leistung hier kein Problem.BEARBEITEN
Da ich meine Antwort immer wieder auf den neuesten Stand bringe (danke Leute 😊), lohnt es sich, dies zu berücksichtigen:
Auf Java 8 weiter wäre es nur besser lesbar und explizit verwenden StringJoiner . Es gibt eine Methode für ein einfaches Trennzeichen und eine Überladung für Präfix und Suffix.
Beispiele aus hier: Beispiel
Beispiel mit einfachem Trennzeichen:
Ausgabe:
Beispiel mit Suffix und Präfix:
Ausgabe
quelle
,
weil es die letzte Aussage des warfor loop
. DaslastInfexOf
ist mehr , um die Lesbarkeit und es ein Kinderspiel zu machen , wenn Sie wollen nicht daran erinnern , ob es 0-indiziert ist oder nicht. Außerdem müssen Sie sich nicht in die Länge des Stringbuilders einmischen. Es ist nur für die Bequemlichkeit.In diesem Fall,
ist vorzuziehen, da nur der letzte Wert zugewiesen wird,
'\0'
während das Löschen des letzten Zeichens dies tutSystem.arraycopy
quelle
setLength
Aufruf weist dem letzten Wert nichts zu. Java-String-Puffer werden nicht mit Null / Null abgeschlossen. In der TatsetLength
wird einfach einlength
Feld aktualisiert .arraycopy
kopiert 0 Elemente, also denke ich, dass es weg optimiert werden kann.Mit können
Java-8
Sie statische Methode derString
Klasse verwenden,String#join(CharSequence delimiter,Iterable<? extends CharSequence> elements)
.AUSGABE
quelle
Eine andere Alternative
quelle
Alternative,
quelle
quelle
Noch eine Alternative:
quelle
Um eine erneute Aktivierung (Beeinträchtigung der Leistung) der
prefix
Verwendung von TextUtils.isEmpty zu vermeiden :quelle
Sie können versuchen, die Joiner-Klasse zu verwenden, anstatt das letzte Zeichen aus Ihrem generierten Text zu entfernen.
quelle
Ich mache so etwas wie unten:
quelle
Hier ist eine andere Lösung:
quelle
Ich persönlich möchte am Ende ein Backspace-Zeichen (oder mehr für ein längeres "Trennzeichen") anhängen:
Beachten Sie, dass es Probleme gibt:
\b
angezeigt wird, hängt von der Umgebung ab.length()
derString
Inhalt kann von der Länge der „visibile“ Zeichen unterschiedlich seinWenn es gut
\b
aussieht und die Länge keine Rolle spielt, z. B. das Anmelden an einer Konsole, scheint mir das gut genug zu sein.quelle
stringBuilder.Remove (stringBuilder.Length - 1, 1);
quelle