Java: вывести двумерный массив строк в виде таблицы с выравниванием по правому краю - PullRequest
2 голосов
/ 09 ноября 2008

Каков способ best для печати ячеек массива String[][] в виде таблицы с выравниванием по правому краю? Например, ввод

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

должен выдавать результат

  x xxx
yyy   y
 zz  zz

Это похоже на то, что должен быть в состоянии выполнить, используя java.util.Formatter, но, похоже, он не допускает непостоянную ширину поля. Наилучшим ответом будет использование некоторого стандартного метода для заполнения ячеек таблицы, а не ручная вставка пробелов.

Ответы [ 3 ]

4 голосов
/ 09 ноября 2008

Действительно, если вы укажете ширину для полей, она должна быть выровнена по правому краю.
Если вам нужно иметь динамическое заполнение, минимальное для самой длинной строки, вы должны пройти массив, получив максимальную ширину, сгенерировать строку формата с шириной, вычисленной из этих максимумов, и использовать ее для форматирования вывода.

4 голосов
/ 09 ноября 2008

Вот ответ, использующий динамически генерируемые строки формата для каждого столбца:

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]);
    }
  }
}
1 голос
/ 09 ноября 2008

найти длину самой длинной строки ..
оставьте все строки с пробелами, пока они не наберут эту длину System.out.print их используя 2 вложенных для циклов

...