comma_separated_lists_in_java(37) Sprache: Deutsch


Kommagetrennte Listen in Java

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++) {
                        ausgabe.append(String.valueOf(liste[i]));
                        ausgabe.append(',');
                }
                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)
                                ausgabe.append(',');
                        ausgabe.append(liste[i]);
                }
                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++) {
                        ausgabe.append(sep);
                        ausgabe.append(String.valueOf(liste[i]));
                        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>();
                data.add(1);
                data.add(2);
                data.add(3); // ...
                StringBuilder ausgabe = new StringBuilder();
                Iterator<Integer> values = data.iterator();
                while(values.hasNext()) {
                        ausgabe.append(values.next());
                        if(values.hasNext())
                                ausgabe.append(',');
                }
                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"));
        }
}


Zum Seitenanfang