Was ist der klarste Weg, eine Liste in Java durch Kommas zu trennen?
Ich kenne verschiedene Möglichkeiten, aber ich frage mich, was der beste Weg ist (wobei "am besten" am klarsten und / oder am kürzesten bedeutet, nicht am effizientesten.
Ich habe eine Liste und möchte sie durchlaufen und jeden Wert drucken. Ich möchte zwischen jedem Element ein Komma drucken, aber nicht nach dem letzten (noch vor dem ersten).
List --> Item ( , Item ) *
List --> ( Item , ) * Item
Probenlösung 1:
boolean isFirst = true;
for (Item i : list) {
if (isFirst) {
System.out.print(i); // no comma
isFirst = false;
} else {
System.out.print(", "+i); // comma
}
}
Beispiellösung 2 - Erstellen Sie eine Unterliste:
if (list.size()>0) {
System.out.print(list.get(0)); // no comma
List theRest = list.subList(1, list.size());
for (Item i : theRest) {
System.out.print(", "+i); // comma
}
}
Probenlösung 3:
Iterator<Item> i = list.iterator();
if (i.hasNext()) {
System.out.print(i.next());
while (i.hasNext())
System.out.print(", "+i.next());
}
Diese behandeln den ersten Gegenstand besonders; man könnte stattdessen den letzten speziell behandeln.
Im übrigen ist hier, wie List
toString
wird umgesetzt (es ist geerbt von AbstractCollection
), in Java 1.6:
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
Es verlässt die Schleife vorzeitig, um das Komma nach dem letzten Element zu vermeiden. Übrigens: Dies ist das erste Mal, dass ich mich erinnere, "(diese Sammlung)" gesehen zu haben. Hier ist der Code, um es zu provozieren:
List l = new LinkedList();
l.add(l);
System.out.println(l);
Ich begrüße jede Lösung, auch wenn sie unerwartete Bibliotheken verwenden (regulärer Ausdruck?); und auch Lösungen in anderen Sprachen als Java (z. B. denke ich, dass Python / Ruby eine Intersperse- Funktion haben - wie ist das implementiert?).
Klarstellung : Mit Bibliotheken meine ich die Standard-Java-Bibliotheken. Für andere Bibliotheken betrachte ich sie mit anderen Sprachen und bin daran interessiert zu wissen, wie sie implementiert sind.
Das EDIT- Toolkit erwähnte eine ähnliche Frage: Letzte Iteration der erweiterten for-Schleife in Java
Und noch eines: Verdient das letzte Element in einer Schleife eine separate Behandlung?
quelle
Antworten:
Java 8 und höher
Mit
StringJoiner
Klasse:Verwenden von
Stream
undCollectors
:Java 7 und früher
Siehe auch # 285523
quelle
quelle
Java 8 bietet dazu mehrere neue Möglichkeiten:
join
Methode aufString
.joining
Sammler für Streams aus derCollectors
Klasse.StringJoiner
Klasse.Beispiel:
Der Ansatz mit Streams setzt voraus
import static java.util.stream.Collectors.joining;
.quelle
Tischler .
quelle
Wenn Sie das Spring Framework verwenden, können Sie dies mit StringUtils tun :
quelle
Basierend auf der Implementierung von Java List toString:
Es verwendet eine Grammatik wie diese:
Wenn es auf der letzten statt auf der ersten Basis basiert, kann es mit demselben Test nach Überspringkomma suchen, um nach dem Ende der Liste zu suchen. Ich finde diesen sehr elegant, bin mir aber bei der Klarheit nicht sicher.
quelle
quelle
Es gibt eine schöne Möglichkeit, dies mit Java 8 zu erreichen:
quelle
quelle
Eine Option für die foreach-Schleife ist:
quelle
Update : Wie Dave Webb in den Kommentaren erwähnt hat, führt dies möglicherweise nicht zu korrekten Ergebnissen, wenn die ersten Elemente in der Liste leere Zeichenfolgen sind.
quelle
Normalerweise mache ich das:
Obwohl ich denke, dass ich diese Überprüfung von nun an gemäß der Java-Implementierung durchführen werde;)
quelle
Wenn Sie Groovy verwenden können (das auf der JVM ausgeführt wird):
quelle
(Kopieren und Einfügen meiner eigenen Antwort von hier .) Viele der hier beschriebenen Lösungen sind meiner Meinung nach etwas übertrieben, insbesondere diejenigen, die auf externen Bibliotheken basieren. Es gibt eine schöne, saubere und klare Sprache, um eine durch Kommas getrennte Liste zu erhalten, die ich immer verwendet habe. Es basiert auf dem bedingten (?) Operator:
Bearbeiten : Ursprüngliche Lösung korrekt, aber laut Kommentaren nicht optimal. Ein zweites Mal versuchen:
Los geht's in 4 Codezeilen, einschließlich der Deklaration des Arrays und des StringBuilder.
2. Bearbeitung : Wenn Sie es mit einem Iterator zu tun haben:
quelle
Normalerweise benutze ich etwas ähnliches wie Version 3. Es funktioniert gut c / c ++ / bash / ...: P.
quelle
Ich habe es nicht kompiliert ... sollte aber funktionieren (oder kurz vor der Arbeit stehen).
quelle
Das ist sehr kurz, sehr klar, aber es gibt meiner Sensibilität die schleichenden Schrecken. Es ist auch etwas umständlich, sich an verschiedene Trennzeichen anzupassen, insbesondere wenn es sich um einen String (nicht char) handelt.
Inspiriert von: Letzte Iteration der erweiterten for-Schleife in Java
quelle
quelle
Item1Item2, Item3, Item4,
Ich mag diesen Ansatz, den ich vor einiger Zeit in einem Blog gefunden habe. Leider erinnere ich mich nicht an den Namen / die URL des Blogs.
Sie können eine Dienstprogramm- / Hilfsklasse erstellen, die folgendermaßen aussieht:
Die Verwendung der Hilfsklasse ist so einfach:
quelle
Da Ihr Trennzeichen "" ist, können Sie Folgendes verwenden:
Wenn Ihr Trennzeichen etwas anderes ist, funktioniert dies für Sie nicht.
quelle
Ich mag diese Lösung:
Ich gehe davon aus, dass es auch StringBuilder verwenden kann.
quelle
Meiner Meinung nach ist dies am einfachsten zu lesen und zu verstehen:
quelle
In Python ist es einfach
",". beitreten (Ihre Liste)
In C # gibt es eine statische Methode für die String-Klasse
String.Join (",", yourlistofstrings)
Entschuldigung, ich bin mir bei Java nicht sicher, dachte aber, ich würde mich melden, als Sie nach anderen Sprachen fragten. Ich bin mir sicher, dass es in Java etwas Ähnliches geben würde.
quelle
Sie können die Trennzeichenfolge auch bedingungslos hinzufügen und nach der Schleife das zusätzliche Trennzeichen am Ende entfernen. Wenn Sie am Anfang eine "Wenn die Liste leer ist, geben Sie diese Zeichenfolge zurück" verwenden, können Sie die Prüfung am Ende vermeiden (da Sie keine Zeichen aus einer leeren Liste entfernen können).
Die Frage ist also wirklich:
"Was ist Ihrer Meinung nach angesichts einer Schleife und eines Wenn der klarste Weg, diese zusammen zu haben?"
quelle
quelle
listToString.substring(0, listToString.length()-separator.length());
Basierend auf dem klarsten Weg, eine Liste durch Kommas zu trennen (Java)?
Mit dieser Idee: Verdient das letzte Element in einer Schleife eine separate Behandlung?
quelle
for (int i=0; i<1; i++)
zuif (array.length>0)
.quelle
Keine der Antworten verwendet bisher Rekursion ...
quelle
quelle
Methode
Verwendung
Angesichts der Anordnung von [1,2,3]
quelle