Problem
Es kommt häufig vor, dass man in Java über eine Liste oder ein Array iteriert, um eine mit Kommata getrennte Liste zu erzeugen. Dabei entsteht aber ein Problem, welches der folgende Code zeigt:
public class ListProblem {
public static void main(String[] args) {
int[] liste = { 1, 2, 3, 4, 5 };
StringBuilder ausgabe = new StringBuilder();
for(int i = 0; i < liste.length; i++) {
.append(String.valueOf(liste[i]));
ausgabe.append(',');
ausgabe}
System.out.println(ausgabe.toString());
}
}
Der Code funktioniert zwar, gibt aber folgende, hässliche Ausgabe aus:
1,2,3,4,5,
Störend ist das letzte Komma. Auch nach langer Internetrecherche
scheint es in Java keine vernünftige Methode zu geben, das Problem zu
lösen. Es gibt zwar viele Möglichkeiten, das Problem anzugehen, aber
alle sehen „hässlich” aus. Das Ma_Sys.ma verwendet z. B. häufig etwa die
folgende Schreibweise, die zwar relativ effizent ist, aber nicht gut
funktioniert, wenn es keine Indexvariable i
gibt, sondern
z. B. einen Iterator
.
public class ListProblem {
public static void main(String[] args) {
int[] liste = { 1, 2, 3, 4, 5 };
StringBuilder ausgabe = new StringBuilder();
for(int i = 0; i < liste.length; i++) {
if(i != 0)
.append(',');
ausgabe.append(liste[i]);
ausgabe}
System.out.println(ausgabe.toString());
}
}
Es gibt auch diverse Lösungen, die den ersten Eintrag oder den Letzen speziell behandeln und die Reichweite der Forschleife entsprechend abändern. Tendenziell sehen diese aber noch hässlicher aus. Eine kreative Alternative, die im Folgenden zu sehen ist, fand sich hingegen auf StackOverflow. Dort stehen auch noch einige weitere Ideen, aber keine von denen, die mit der standard Java Klassenbibliothek auskommen, ist wirklich überzeugend. Für eine Liste könnte man vielleicht den Code unten verwenden, der beim Ma_Sys.ma ebenfalls häufig so eingesetzt wird.
public class ListProblem {
public static void main(String[] args) {
int[] liste = { 1, 2, 3, 4, 5 };
StringBuilder ausgabe = new StringBuilder();
String sep = "";
for(int i = 0; i < liste.length; i++) {
.append(sep);
ausgabe.append(String.valueOf(liste[i]));
ausgabe= ",";
sep }
System.out.println(ausgabe.toString());
}
}
import java.util.ArrayList;
import java.util.Iterator;
public class ListProblem {
public static void main(String[] args) {
ArrayList<Integer> data = new ArrayList<Integer>();
.add(1);
data.add(2);
data.add(3); // ...
dataStringBuilder ausgabe = new StringBuilder();
Iterator<Integer> values = data.iterator();
while(values.hasNext()) {
.append(values.next());
ausgabeif(values.hasNext())
.append(',');
ausgabe}
System.out.println(ausgabe.toString());
}
}
Leider kommen solche Konstrukte an vielen Stellen mit vielen verschiedenen Arten von Listen und Arrays vor. Es wäre hilfreich, wenn dafür eine neue Klasse in die Standardbiliothek eingebaut werden würde.
Lösung
Java 8 bietet tatsächlich eine entsprechende Möglichkeit (wenn man
schon eine CharSequence
in irgend einer Form hat)!
import java.util.Arrays;
public class ListProblemSolution {
public static void main(String[] args) {
System.out.println(String.join(",", "1", "2", "3"));
}
}