Möglichkeit regelmäßige indentation mittels/innerhalb Stringbuilder

Diskutiere Möglichkeit regelmäßige indentation mittels/innerhalb Stringbuilder im Allgemeine Java-Themen Bereich.
Zrebna

Zrebna

Hi!

So geht es schon mal analog zu printf in C nicht:

Java:
 StringBuilder s = new StringBuilder();
String constantIndent = "%*20";

.append("foo").append(constantIndent)
sonst finde ich leider per google keine Lösung - ich füge ein Bild ein, damit klar ist, was ich brauche und hoffe auf Hilfe.

Lg,
Zrebna
 

Anhänge

mihe7

mihe7

Du meinst etwas wie?
Java:
String.format("  %-10s %s", "branch", "List, create, or delete branches");
Beispiel:
Java:
String[] values = {"branch", "List, create, or delet branches",
        "commit", "Record changes to the repository",
        "merge", "Join two or more development histories together"};
String output = IntStream.range(0, values.length/2)
        .mapToObj(i -> String.format("  %-10s %s", values[2*i], values[2*i+1]))
        .collect(Collectors.joining("\n"));
System.out.println(output);
liefert
Code:
  branch     List, create, or delet branches
  commit     Record changes to the repository
  merge      Join two or more development histories together
 
mrBrown

mrBrown

String.format("%-20s", "foo")?

Edit: zu langsam gewesen, die Antwort von @mihe7 ist deutlich schöner :)
 
Zrebna

Zrebna

Ah, schade - wollte eigentlich unbedingt den Stringbuilder verwenden - gibt es hierfür evtl. auch eine Lösung?
Aber danke schonmal für den Vorschlag oben:)
 
mihe7

mihe7

wollte eigentlich unbedingt den Stringbuilder verwenden
builder.append(String.format("%-10s", "foo"))

oder

Java:
String[] values = {"branch", "List, create, or delet branches",
        "commit", "Record changes to the repository",
        "merge", "Join two or more development histories together"};
StringBuilder b = new StringBuilder();
IntStream.range(0, values.length/2)
        .mapToObj(i -> String.format("  %-10s %s", values[2*i], values[2*i+1]))
        .forEach(s -> b.append(s).append("\n"));
System.out.print(b.toString());
 
I

insert2020

Oder als Einzeiler für beliebige Tabellen...
Java:
	public static String indent(String[][] a, int... is) {
		return IntStream.range(0, a.length)
				.mapToObj(i -> IntStream.range(0, a[i].length)
						.mapToObj(j -> String.format("%5s%-" + is[j] + "s", " ", a[i][j]))
						.collect(Collectors.joining()))
				.collect(Collectors.joining("\n"));
	}

	public static void main(String[] args) throws IOException {
		System.out.println(indent(new String[][] { { "Text", "mit" }, { "mit", "Text" } }, 20, 10));
	}
 
Zrebna

Zrebna

Vielen Dank für die Hilfe - hat nun geklappt:)

Eine generelle Frage:
Wenn man einen StringBuilder verwender und eine 'neue Zeile' hinzufügen möchte, was verwendet man bevorzugt und wieso?
a.) builder.append(String.format("\n"))
oder
b.) builder.append(System.lineSeparator())

Oder ganz was anderes?

Was ist in seiner Verwendung auch auf OS-Unabhängigkeit am sichersten?
Will heissen, man codet auf einem Windows-OS und es soll aber auch beim Kollegen auf einem Linux/Unix-System laufen...

Lg,
Zrebna
 
mihe7

mihe7

Was ist in seiner Verwendung auch auf OS-Unabhängigkeit am sichersten?
Will heissen, man codet auf einem Windows-OS und es soll aber auch beim Kollegen auf einem Linux/Unix-System laufen...
Die Frage gibt in der Form für mich keinen Sinn. Die Frage ist, wofür der String gedacht ist.

Entweder baust Du einen String, der nur für Dein Programm bestimmt ist, dann kannst Du verwenden, was Du lustig bist (bzw. was vom ggf. verwendeten Framework bzw. einer entsprechenden Bibliothek erwartet wird). Oder Du baust einen String, der (auch) für andere Anwendungen bestimmt ist.

Für den Fall einer Ausgabe von Text auf der "Konsole" baust Du einen String, der für ein anderes Programm (die Konsole) bestimmt ist. Damit diese Ausgabe möglichst plattformunabhängig funktioniert, kannst Du im Format-String %n (statt \n) verwenden oder eben auf System.lineSeparator() zurückgreifen.

Ähnlich verhält es sich, wenn Du Textdateien schreibst. Soll die Ausgabe in einem für die Plattform typischen Programm gelesen werden können, würdest Du %n bzw. System.lineSeparator() verwenden. Willst Du dagegen Dateien schreiben, die Du zwischen Instanzen Deiner Anwendung austauschen kannst, dann sollte Dich das plattform-spezifische Zeilenende nicht interessieren - die Ausgabe erfolgt ja für Dein plattformunabhängiges Progamm.
 
I

insert2020

Also - wenn es nicht um Dateien geht, sondern nur um Konsolen, dann ist, soweit mir bekannt, "\n" in beiden Fällen, also sowohl in Windows wie in Linux, ein Zeilenumbruch.
Du kannst dann also einfach "\n" verwenden.
Für Dateien oder den Austausch mit anderen Programmen... gibt es eigentlich höherlevelige Wrapper wie zum Beispiel PrintWriter und BufferedWriter... Diese regeln die Zeilenumbruchzeichen plattformspezifisch (automatisch)... so dass der Programmierer sich nicht mehr damit ärgern muss.
 
Zrebna

Zrebna

Allles klar, danke für die Antworten.

Also kurz gesagt: System.lineSeparator() klappt wohl immer und in jedem Fall und %n statt \n wohl auch meist.
 
Zrebna

Zrebna

Code soll bzgl. 'neue Zeile' auf einem Unix/Linux-System laufen.

Stellt das System.lineSeparator() sicher?
 
mihe7

mihe7

Code soll bzgl. 'neue Zeile' auf einem Unix/Linux-System laufen.

Stellt das System.lineSeparator() sicher?
Ja, wenn der Code auf einem Unix-System ausgeführt wird, liefert System.lineSeparator() halt Line Feed (\n). Führst Du den gleichen Code aus einem Windows-System aus, liefert System.lineSeparator() Carriage Return und Line Feed (\r\n).
 
Zrebna

Zrebna

Alles klar - visuell für den Betrachter (mit dem Unix-/Linux-System) auf der Konsole aber das selbe Ergebnis - also eine 'neue Zeile' , oder?
 
I

insert2020

visuell für den Betrachter (mit dem Unix-/Linux-System) auf der Konsole aber das selbe Ergebnis - also eine 'neue Zeile' , oder?
Also entweder "das Fenster" akzeptiert die Zeichen für einen neuen Zeilenumbruch, dann ist der zu sehen, oder er wird nicht akzeptiert, dann ist auch kein Zeilenumbruch zu sehen...
Windows hat eben das Urzeitrelikt, dass es noch ein carriage return haben möchte...
Ältere Macs ebenfalls...:

TL;DR Es kommt immer auf den Einsatzzweck an.
 
Thema: 

Möglichkeit regelmäßige indentation mittels/innerhalb Stringbuilder

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben