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).

5voto

Jason Day Punkte 8719

Eine weitere Alternative:

public String join(Collection<String> collection, String seperator) {
    if (collection.isEmpty()) return "";

    Iterator<String> iter = collection.iterator();
    StringBuilder sb = new StringBuilder(iter.next());
    while (iter.hasNext()) {
        sb.append(seperator);
        sb.append(iter.next());
    }

    return sb.toString();
}

3voto

NickUnuchek Punkte 9966

Um die Wiederaufnahme (Beeinträchtigung der Leistung) von prefix TextUtils.isEmpty verwenden:

            String prefix = "";
            for (String item : list) {
                sb.append(prefix);
                if (TextUtils.isEmpty(prefix))
                    prefix = ",";
                sb.append(item);
            }

1voto

Vikasdeep Singh Punkte 19310

Ich mache etwas wie unten:

    StringBuilder stringBuilder = new StringBuilder();
    for (int i = 0; i < value.length; i++) {
        stringBuilder.append(values[i]);
        if (value.length-1) {
            stringBuilder.append(", ");
        }
    }

1voto

oguzhan Punkte 1873

Sie können versuchen, die Klasse "Joiner" zu verwenden, anstatt das letzte Zeichen aus dem generierten Text zu entfernen;

                List<String> textList = new ArrayList<>();
                textList.add("text1");
                textList.add("text2");
                textList.add("text3");

                Joiner joiner = Joiner.on(",").useForNull("null");
                String output = joiner.join(textList);

               //output : "text1,text2,text3"

1voto

egerardus Punkte 11016

Ich habe mich dabei ertappt, dass ich das ziemlich oft gemacht habe, also habe ich einen Benchmark für die 3 wichtigsten Begrenzungstechniken für Anhänge geschrieben:

(Benchmark mit angemessener Aufwärmphase und 100 Runden mit 100.000 Iterationen)

"Anhängen nach"

static void appendAfter()
{
    sb.append('{');
    for (int i = 0; i < 10; i++)
    {
        sb.append('"');
        sb.append(i);
        sb.append('"');
        sb.append(':');
        sb.append(i);
        sb.append(',');
    }
    sb.setLength(sb.length() - 1);
    sb.append('}');
}

"Anhängen vor"

static void appendBefore()
{
    sb.append('{');
    String delimiter = "";
    for (int i = 0; i < 10; i++)
    {
        sb.append(delimiter);
        sb.append('"');
        sb.append(i);
        sb.append('"');
        sb.append(':');
        sb.append(i);
        delimiter = ",";
    }
    sb.append('}');
}

"Vielleicht anhängen"

static void appendMaybe()
{
    sb.append('{');
    for (int i = 0; i < 10; i++)
    {
        sb.append('"');
        sb.append(i);
        sb.append('"');
        sb.append(':');
        sb.append(i);
        if (i < 9)
        {
            sb.append(',');
        }
    }
    sb.append('}');
}

Ich habe die folgenden Ergebnisse erhalten:

Plattform

Anhängen nach

Anhängen vor

Vielleicht anhängen

Windows Server 2016, Java 11 - Hotspot

26ms

40ms

26ms

Windows Server 2016, Java 8 - Hotspot

27ms

36ms

21ms

Windows Server 2016, Java 11 - OpenJ9

63ms

81ms

59ms

Windows Server 2016, Java 8 - OpenJ9

66ms

64ms

55ms

Abgesehen davon, dass sie die schnellste ist, bin ich der Meinung, dass die "Append Maybe"-Implementierung die Absicht des Codes am besten zeigt. Das ist in der Regel wichtiger als der Bruchteil der pro Iteration gewonnenen Nanosekunden.

Ich habe den Benchmark-Code aquí für den Fall, dass jemand es auf seiner Plattform ausprobieren möchte. Bitte stellen Sie Ihre Ergebnisse oben ein, wenn Sie dies tun!

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