352 Stimmen

Der beste Weg, um eine ArrayList in eine Zeichenkette zu konvertieren

Ich habe eine ArrayList die ich vollständig als String ausgeben möchte. Im Wesentlichen möchte ich sie in der Reihenfolge ausgeben, in der die toString der einzelnen Elemente durch Tabulatoren getrennt. Gibt es eine schnelle Möglichkeit, dies zu tun? Sie könnten Schleife durch sie (oder entfernen Sie jedes Element) und verketten es zu einem String, aber ich denke, dies wird sehr langsam sein.

19voto

kehers Punkte 3968

Android hat eine TextUtil-Klasse, die Sie verwenden können http://developer.Android.com/reference/Android/text/TextUtils.html

String implode = TextUtils.join("\t", list);

15voto

amra Punkte 14794

In Java 8 ist das ganz einfach. Siehe Beispiel für eine Liste von Ganzzahlen:

String result = Arrays.asList(1,2,3).stream().map(Object::toString).reduce((t, u) -> t + "\t" + u).orElse("");

Oder eine mehrzeilige Version (die einfacher zu lesen ist):

String result = Arrays.asList(1,2,3).stream()
    .map(Object::toString)
    .reduce((t, u) -> t + "\t" + u)
    .orElse("");

Update - eine kürzere Version

String result = Arrays.asList(1,2,3).stream()
                .map(Object::toString)
                .collect(Collectors.joining("\t"));

13voto

akuhn Punkte 26637

Eine elegante Möglichkeit, mit nachgestellten Trennzeichen umzugehen, ist die Verwendung von Klassentrenner

StringBuilder buf = new StringBuilder();
Separator sep = new Separator("\t");
for (String each: list) buf.append(sep).append(each);
String s = buf.toString();

Die Methode toString der Klasse Separator gibt das Trennzeichen zurück, außer für den ersten Anruf. So drucken wir die Liste ohne abschließende (oder in diesem Fall) führende Trennzeichen.

6voto

Mike C. Punkte 995

Es ist ein O(n) Algorithmus so oder so (es sei denn, Sie haben eine Multithreading-Lösung, bei der Sie die Liste in mehrere Unterlisten aufteilen, aber ich glaube nicht, dass es das ist, wonach Sie fragen).

Verwenden Sie einfach eine StringBuilder wie unten:

StringBuilder sb = new StringBuilder();

for (Object obj : list) {
  sb.append(obj.toString());
  sb.append("\t");
}

String finalString = sb.toString();

En StringBuilder ist viel schneller als die Verkettung von Zeichenketten, da Sie nicht erneut eine String-Instanzierung durchführen müssen. String Objekt bei jeder Verkettung.

6voto

Javad Punkte 5365

Für den Fall, dass Sie zufällig auf Android sind und Jack noch nicht verwenden (z.B. weil es noch keine Unterstützung für Instant Run gibt), und wenn Sie mehr Kontrolle über die Formatierung der resultierenden Zeichenkette haben möchten (z.B. möchten Sie das Newline-Zeichen als Trennzeichen von Elementen verwenden), und zufällig die StreamSupport-Bibliothek verwenden (für die Verwendung von Streams auf Java 7 oder früheren Versionen des Compilers), könnten Sie etwas wie dieses verwenden (ich habe diese Methode in meine ListUtils-Klasse eingebaut):

public static <T> String asString(List<T> list) {
    return StreamSupport.stream(list)
            .map(Object::toString)
            .collect(Collectors.joining("\n"));
}

Und natürlich müssen Sie toString() in der Klasse Ihrer Listenobjekte implementieren.

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