374 Stimmen

Wie kann man in Java am besten eine Zeichenkette mit abgegrenzten Elementen erstellen?

Bei der Arbeit in einer Java-Anwendung musste ich kürzlich eine durch Kommata getrennte Liste von Werten zusammenstellen, die ich an einen anderen Webdienst weitergeben wollte, ohne im Voraus zu wissen, wie viele Elemente es sein würden. Das Beste, was mir auf Anhieb einfiel, war so etwas wie dieses:

public String appendWithDelimiter( String original, String addition, String delimiter ) {
    if ( original.equals( "" ) ) {
        return addition;
    } else {
        return original + delimiter + addition;
    }
}

String parameterString = "";
if ( condition ) parameterString = appendWithDelimiter( parameterString, "elementName", "," );
if ( anotherCondition ) parameterString = appendWithDelimiter( parameterString, "anotherElementName", "," );

Mir ist klar, dass dies nicht besonders effizient ist, da überall Zeichenketten erstellt werden, aber mir ging es mehr um Klarheit als um Optimierung.

In Ruby kann ich stattdessen etwas Ähnliches machen, was sich viel eleganter anfühlt:

parameterArray = [];
parameterArray << "elementName" if condition;
parameterArray << "anotherElementName" if anotherCondition;
parameterString = parameterArray.join(",");

Aber da Java keinen Join-Befehl hat, konnte ich nichts Vergleichbares finden.

Wie lässt sich dies in Java am besten bewerkstelligen?

0voto

java al Punkte 1

Leichte Verbesserung [Geschwindigkeit] der Version von izb:

public static String join(String[] strings, char del)
{
    StringBuilder sb = new StringBuilder();
    int len = strings.length;

    if(len > 1) 
    {
       len -= 1;
    }else
    {
       return strings[0];
    }

    for (int i = 0; i < len; i++)
    {
       sb.append(strings[i]).append(del);
    }

    sb.append(strings[i]);

    return sb.toString();
}

0voto

MetroidFan2002 Punkte 28293
//Note: if you have access to Java5+, 
//use StringBuilder in preference to StringBuffer.  
//All that has to be replaced is the class name.  
//StringBuffer will work in Java 1.4, though.

appendWithDelimiter( StringBuffer buffer, String addition, 
    String delimiter ) {
    if ( buffer.length() == 0) {
        buffer.append(addition);
    } else {
        buffer.append(delimiter);
        buffer.append(addition);
    }
}

StringBuffer parameterBuffer = new StringBuffer();
if ( condition ) { 
    appendWithDelimiter(parameterBuffer, "elementName", "," );
}
if ( anotherCondition ) {
    appendWithDelimiter(parameterBuffer, "anotherElementName", "," );
}

//Finally, to return a string representation, call toString() when returning.
return parameterBuffer.toString();

0voto

Sie machen die Sache etwas komplizierter, als sie sein müsste. Beginnen wir mit dem Ende deines Beispiels:

String parameterString = "";
if ( condition ) parameterString = appendWithDelimiter( parameterString, "elementName", "," );
if ( anotherCondition ) parameterString = appendWithDelimiter( parameterString, "anotherElementName", "," );

Mit der kleinen Änderung, einen StringBuilder anstelle eines Strings zu verwenden, wird daraus:

StringBuilder parameterString = new StringBuilder();
if (condition) parameterString.append("elementName").append(",");
if (anotherCondition) parameterString.append("anotherElementName").append(",");
...

Wenn Sie fertig sind (ich nehme an, Sie müssen auch noch einige andere Bedingungen überprüfen), stellen Sie sicher, dass Sie das abschließende Komma mit einem Befehl wie diesem entfernen:

if (parameterString.length() > 0) 
    parameterString.deleteCharAt(parameterString.length() - 1);

Und schließlich erhalten Sie die gewünschte Zeichenkette mit

parameterString.toString();

Sie könnten auch das "," im zweiten Aufruf zum Anhängen durch eine allgemeine Trennzeichenfolge ersetzen, die auf einen beliebigen Wert gesetzt werden kann. Wenn Sie eine Liste von Dingen haben, von denen Sie wissen, dass Sie sie (nicht unbedingt) anhängen müssen, könnten Sie diesen Code in eine Methode einfügen, die eine Liste von Strings annimmt.

0voto

Aaron Punkte 22832

Anstelle der String-Verkettung sollten Sie StringBuilder verwenden, wenn Ihr Code nicht mit einem Thread versehen ist, und StringBuffer, wenn dies der Fall ist.

0voto

Yaba Punkte 5949

Ihr Ansatz ist nicht allzu schlecht, aber Sie sollten einen StringBuffer verwenden, anstatt das + Zeichen zu benutzen. Das + hat den großen Nachteil, dass für jede einzelne Operation eine neue String-Instanz erzeugt wird. Je länger der String wird, desto größer wird der Overhead. Daher sollte die Verwendung eines StringBuffers der schnellste Weg sein:

public StringBuffer appendWithDelimiter( StringBuffer original, String addition, String delimiter ) {
        if ( original == null ) {
                StringBuffer buffer = new StringBuffer();
                buffer.append(addition);
                return buffer;
        } else {
                buffer.append(delimiter);
                buffer.append(addition);
                return original;
        }
}

Nachdem Sie Ihre Zeichenkette erstellt haben, rufen Sie einfach toString() für den zurückgegebenen StringBuffer auf.

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