Java: Imprimir uma matriz 2D String como uma mesa justificado direita
-
07-07-2019 - |
Pergunta
O que é a melhor maneira de imprimir as células de uma matriz String[][]
como uma tabela justificado direita? Por exemplo, a entrada
{ { "x", "xxx" }, { "yyy", "y" }, { "zz", "zz" } }
deve produzir a saída
x xxx
yyy y
zz zz
Este parece ser algo que um deve ser capaz de realizar usando java.util.Formatter
, mas não parecem permitir larguras de campo não constantes. A melhor resposta vai usar algum método padrão para acolchoar as células da tabela, e não a introdução manual do caracteres de espaço.
Solução
Na verdade, se você especificar uma largura para os campos, deve ser justificado direita.
Se você precisa ter uma cobertura dinâmica, mínimo para a cadeia mais longa, você tem que andar a matriz, ficando a largura máxima, gerar a string de formato com a largura calculado a partir desta maxima, e usá-lo para o formato de saída.
Outras dicas
Aqui está uma resposta, usando cordas do formato geradas dinamicamente para cada coluna:
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$" + 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]);
}
}
}
encontrar o comprimento da maior string ..
almofada esquerda todas as cordas com espaços até que eles r que o comprimento + 1 |
System.out.print-los usando 2 aninhados loops