Java: stampa un array di stringhe 2D come tabella giustificata a destra
-
07-07-2019 - |
Domanda
Qual è il modo migliore per stampare le celle di un array String [] []
come una tabella giustificata a destra? Ad esempio, l'input
{ { "x", "xxx" }, { "yyy", "y" }, { "zz", "zz" } }
dovrebbe produrre l'output
x xxx
yyy y
zz zz
Sembra qualcosa che un dovrebbe essere in grado di realizzare usando java.util.Formatter
, ma non sembra consentire larghezze di campo non costanti. La risposta migliore utilizzerà un metodo standard per riempire le celle della tabella, non l'inserimento manuale dei caratteri dello spazio.
Soluzione
In effetti, se specifichi una larghezza per i campi, dovrebbe essere giustificata a destra.
Se devi avere un padding dinamico, minimo per la stringa più lunga, devi camminare sull'array, ottenere la larghezza massima, generare la stringa di formato con la larghezza calcolata da questo massimo e usarla per formattare l'output.
Altri suggerimenti
Ecco una risposta, usando stringhe di formato generate dinamicamente per ogni colonna:
public static void printTable(String[][] table) {
// Find out what the maximum number of columns is in any row
int maxColumns = 0;
for (int i = 0; i < table.length; i++) {
maxColumns = Math.max(table[i].length, maxColumns);
}
// Find the maximum length of a string in each column
int[] lengths = new int[maxColumns];
for (int i = 0; i < table.length; i++) {
for (int j = 0; j < table[i].length; j++) {
lengths[j] = Math.max(table[i][j].length(), lengths[j]);
}
}
// Generate a format string for each column
String[] formats = new String[lengths.length];
for (int i = 0; i < lengths.length; i++) {
formats[i] = "%1<*>quot; + lengths[i] + "s"
+ (i + 1 == lengths.length ? "\n" : " ");
}
// Print 'em out
for (int i = 0; i < table.length; i++) {
for (int j = 0; j < table[i].length; j++) {
System.out.printf(formats[j], table[i][j]);
}
}
}
trova la lunghezza della stringa più lunga ..
pad sinistro di tutte le stringhe con spazi fino a quando non hanno quella lunghezza + 1
System.out.print li usando 2 nidificati per loop