Pregunta

¿Cuál es la mejor forma de imprimir las celdas de una matriz String [] [] como una tabla justificada a la derecha? Por ejemplo, la entrada

{ { "x", "xxx" }, { "yyy", "y" }, { "zz", "zz" } }

debería producir el resultado

  x xxx
yyy   y
 zz  zz

Esto parece algo que uno debería ser capaz de lograr usando java.util.Formatter , pero no parece permitir anchos de campo no constantes. La mejor respuesta utilizará algún método estándar para rellenar las celdas de la tabla, no la inserción manual de caracteres de espacio.

¿Fue útil?

Solución

De hecho, si especifica un ancho para los campos, debe estar justificado a la derecha.
Si necesita tener un relleno dinámico, mínimo para la cadena más larga, debe recorrer la matriz, obtener el ancho máximo, generar la cadena de formato con el ancho calculado a partir de estos máximos y usarlo para formatear la salida.

Otros consejos

Aquí hay una respuesta, utilizando cadenas de formato generadas dinámicamente para cada columna:

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

encuentra la longitud de la cadena más larga ..
dejó el pad en todas las cadenas con espacios hasta que tengan esa longitud + 1
System.out.print con 2 bucles anidados para

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top