comma_separated_lists_in_java(37) Sprache: Deutsch


Kommagetrennte Listen in Java

----------------------------------------------------------------------[ Meta ]--

name		comma_separated_lists_in_java
section		37
description	Kommagetrennte Listen in Java
tags		java programming theory patterns kb blog
encoding	utf8
compliance	public
lang		de
creation	2014/08/13 19:23:38
version		1.0.0.0
copyright	Copyright (c) 2014 Ma_Sys.ma.
		For further info send an e-mail to Ma_Sys.ma@web.de.

-------------------------------------------------------------------[ 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

{\code{java}}

	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`.

{\code{java}}

	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(http://
stackoverflow.com/questions/205555/the-most-sophisticated-way-for-creating-
comma-separated-strings-from-a-collectio). 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.

{\code{java}}

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

{\code{java}}

	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