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.
Antworten
Zu viele Anzeigen?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);
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"));
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.
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.
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.