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"));
        }
}

Ma_Sys.ma Website 5 (1.0.0) – no Flash, no JavaScript, no Webfont, no Copy Protection, no Mobile First. No bullshit. No GUI needed. Works with any browser.

Created: 2014/08/13 19:23:38 | Revised: 2020/09/12 17:53:59 | Tags: java, programming, theory, patterns, kb, blog | Version: 1.0.2 | SRC (Pandoc MD) | GPL

Copyright (c) 2014 Ma_Sys.ma. For further info send an e-mail to Ma_Sys.ma@web.de.

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.