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

Zrebna

Bekanntes Mitglied
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

  • constantIndentation.PNG
    constantIndentation.PNG
    27,3 KB · Aufrufe: 17

mihe7

Top Contributor
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
 

Zrebna

Bekanntes Mitglied
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

Top Contributor
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());
 

insert2020

Aktives Mitglied
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

Bekanntes Mitglied
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

Top Contributor
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.
 

insert2020

Aktives Mitglied
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

Bekanntes Mitglied
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.
 

mihe7

Top Contributor
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

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

insert2020

Aktives Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Apache fop -- welche Möglichkeit gibt es um den Fortschritt anzuzeigen (Progressbar) Allgemeine Java-Themen 5
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
Q Möglichkeit Online-Programmieren üben. Allgemeine Java-Themen 9
M Praktische Möglichkeit um Studierenden Java zu erklären Allgemeine Java-Themen 33
S Input/Output Beste Möglichkeit einen String in einen Datei zu Schreiben Allgemeine Java-Themen 2
W Möglichkeit von java Allgemeine Java-Themen 16
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
V Gibt es eine Möglichkeit die Internet auslastung mit Java auszulesen Allgemeine Java-Themen 11
C Input/Output Beste Möglichkeit für user non-readable Datei Allgemeine Java-Themen 7
G Threads Gibt es eine Möglichkeit des Nichtblokierens? Allgemeine Java-Themen 5
L Java TimeZone für bestimmten offset -> Bessere Möglichkeit? Allgemeine Java-Themen 2
C Beste Möglichkeit eine jar mit großem Heapspace zu starten ? Allgemeine Java-Themen 8
M Javamail -> andere Möglichkeit für Attachment Allgemeine Java-Themen 5
FoolMoon Elegante Möglichkeit die kleinste Zahl zu ermitteln. Allgemeine Java-Themen 7
M Java lernen, ist das eine gute Möglichkeit? Allgemeine Java-Themen 5
M Andere Möglichkeit zu casten Allgemeine Java-Themen 8
T Schnellste Möglichkeit Datenverarbeitung Allgemeine Java-Themen 5
T Schnellset Möglichkeit Datei einzulesen Allgemeine Java-Themen 11
K Möglichkeit zur eindeutigen UserID Allgemeine Java-Themen 10
T Möglichkeit um eine Taste zu drücken? Allgemeine Java-Themen 2
M Funktion als Parameter oder andere Möglichkeit Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben