536 Stimmen

Letztes Zeichen eines StringBuilders entfernen?

Wenn Sie eine Sammlung in einer Schleife durchlaufen und aus den einzelnen Daten eine durch ein Begrenzungszeichen getrennte Zeichenkette erstellen müssen, wird am Ende immer ein zusätzliches Begrenzungszeichen eingefügt, z. B.

for (String serverId : serverIds) {
  sb.append(serverId);
   sb.append(",");
}

Es gibt so etwas wie : serverId_1, serverId_2, serverId_3,

Ich möchte das letzte Zeichen im StringBuilder löschen (ohne es zu konvertieren, weil ich es nach dieser Schleife noch brauche).

742voto

Jon Skeet Punkte 1325502

Andere haben darauf hingewiesen, dass die deleteCharAt Methode, aber hier ist ein anderer Ansatz:

String prefix = "";
for (String serverId : serverIds) {
  sb.append(prefix);
  prefix = ",";
  sb.append(serverId);
}

Alternativ können Sie auch die Joiner Klasse von Guave :)

Ab Java 8, StringJoiner ist Teil der Standard-JRE.

553voto

Stephen C Punkte 665668

Eine andere einfache Lösung ist:

sb.setLength(sb.length() - 1);

Eine kompliziertere Lösung:

Die obige Lösung setzt voraus, dass sb.length() > 0 ... d.h. es gibt ein "letztes Zeichen" zu entfernen. Wenn Sie diese Annahme nicht machen können, und/oder Sie können nicht mit der Ausnahme umgehen, die sich ergeben würde, wenn die Annahme falsch ist, dann überprüfen Sie die Länge des StringBuilders zuerst; z.B.

// Readable version
if (sb.length() > 0) {
   sb.setLength(sb.length() - 1);
}

o

// Concise but harder-to-read version of the above.
sb.setLength(Math.max(sb.length() - 1, 0));

224voto

bragboy Punkte 33596
if(sb.length() > 0){
    sb.deleteCharAt(sb.length() - 1);
}

68voto

ArtOfWarfare Punkte 19001

Ab Java 8 hat die String-Klasse eine statische Methode join . Das erste Argument ist eine Zeichenkette, die Sie zwischen jedem Paar von Zeichenketten wünschen, und das zweite ist ein Iterable<CharSequence> (die beide Schnittstellen sind, also etwas wie List<String> funktioniert. Sie können also einfach dies tun:

String.join(",", serverIds);

Auch in Java 8 können Sie die neue StringJoiner für Szenarien, in denen Sie mit der Konstruktion der Zeichenkette beginnen möchten, bevor Sie die vollständige Liste der Elemente haben, die Sie darin einfügen möchten.

49voto

Reuel Ribeiro Punkte 1386

Ermitteln Sie einfach die Position des letzten vorkommenden Zeichens.

for(String serverId : serverIds) {
 sb.append(serverId);
 sb.append(",");
}
sb.deleteCharAt(sb.lastIndexOf(","));

Seit lastIndexOf eine Rückwärtssuche durchführt und Sie wissen, dass sie beim ersten Versuch gefunden wird, ist die Leistung hier kein Problem.

EDITAR

Da ich immer wieder auf meine Antwort angesprochen werde (vielen Dank, Leute), lohnt es sich, dies zu berücksichtigen:

Sur Java 8 es wäre einfach besser lesbar und eindeutiger zu verwenden StringJoiner . Sie hat eine Methode für ein einfaches Trennzeichen und eine Überladung für Präfix und Suffix.

Die Beispiele stammen von hier: Beispiel

Beispiel mit einfachem Trennzeichen:

    StringJoiner mystring = new StringJoiner("-");    

    // Joining multiple strings by using add() method  
    mystring.add("Logan");  
    mystring.add("Magneto");  
    mystring.add("Rogue");  
    mystring.add("Storm");  

    System.out.println(mystring);

出力します。

Logan-Magneto-Rogue-Sturm

Beispiel mit Suffix und Präfix:

    StringJoiner mystring = new StringJoiner(",", "(", ")");    

    // Joining multiple strings by using add() method  
    mystring.add("Negan");  
    mystring.add("Rick");  
    mystring.add("Maggie");  
    mystring.add("Daryl");  

    System.out.println(mystring);

Ausgabe

(Negan, Rick, Maggie, Daryl)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X