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?

2voto

рüффп Punkte 4765

Für diejenigen, die in einem Frühlingskontext ihre StringUtils Klasse ist ebenfalls nützlich:

Es gibt viele nützliche Abkürzungen wie:

  • collectionToCommaDelimitedString(Sammlung coll)
  • collectionToDelimitedString(Sammlung coll, String delim)
  • arrayToDelimitedString(Object[] arr, String delim)

und viele andere.

Dies kann hilfreich sein, wenn Sie noch nicht mit Java 8 arbeiten und sich bereits in einem Spring-Kontext befinden.

Ich bevorzuge es gegenüber Apache Commons (obwohl es auch sehr gut ist) wegen der Unterstützung für Sammlungen, die auf diese Weise einfacher ist:

// Encoding Set<String> to String delimited 
String asString = org.springframework.util.StringUtils.collectionToDelimitedString(codes, ";");

// Decoding String delimited to Set
Set<String> collection = org.springframework.util.StringUtils.commaDelimitedListToSet(asString);

2voto

Craig P. Motlin Punkte 26028

Wenn Sie Folgendes verwenden Eclipse-Kollektionen können Sie verwenden makeString() o appendString() .

makeString() gibt eine String Darstellung, ähnlich wie bei toString() .

Sie hat drei Formen

  • makeString(start, separator, end)
  • makeString(separator) Start und Ende sind standardmäßig leere Zeichenfolgen
  • makeString() ist das Trennzeichen standardmäßig auf ", " (Komma und Leerzeichen)

Code-Beispiel:

MutableList<Integer> list = FastList.newListWith(1, 2, 3);
assertEquals("[1/2/3]", list.makeString("[", "/", "]"));
assertEquals("1/2/3", list.makeString("/"));
assertEquals("1, 2, 3", list.makeString());
assertEquals(list.toString(), list.makeString("[", ", ", "]"));

appendString() ist vergleichbar mit makeString() aber es hängt an einer Appendable (wie StringBuilder ) und ist void . Es hat die gleichen drei Formen, mit einem zusätzlichen ersten Argument, dem Appendable.

MutableList<Integer> list = FastList.newListWith(1, 2, 3);
Appendable appendable = new StringBuilder();
list.appendString(appendable, "[", "/", "]");
assertEquals("[1/2/3]", appendable.toString());

Wenn Sie Ihre Sammlung nicht in einen Eclipse Collections-Typ konvertieren können, passen Sie sie einfach mit dem entsprechenden Adapter an.

List<Object> list = ...;
ListAdapter.adapt(list).makeString(",");

Anmerkung: Ich bin ein Committer für die Eclipse-Sammlungen.

2voto

Dave Costa Punkte 45801

Warum schreiben Sie nicht Ihre eigene join()-Methode? Sie würde als Parameter eine Sammlung von Strings und einen Begrenzer-String annehmen. Innerhalb der Methode wird über die Sammlung iteriert und das Ergebnis in einem StringBuffer zusammengestellt.

2voto

Kent Boogaart Punkte 170094

Sie können die Java-Funktion StringBuilder Typ dafür. Es gibt auch StringBuffer Es enthält jedoch zusätzliche Logik für die Threadsicherheit, die oft unnötig ist.

1voto

Dhruv Naik Punkte 51

Wenn Sie ein Komma in eine Liste von Objekteigenschaften einfügen möchten. Dies ist der Weg, den ich am nützlichsten fand.

aquí getName() ist eine String-Eigenschaft einer Klasse, der ich versucht habe, "," hinzuzufügen.

String message = listName.stream().map(list -> list.getName()).collect(Collectors.joining(", "));

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