Java: распечатать массив 2D String в виде таблицы, выровненной по правому краю

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

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

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

  x xxx
yyy   y
 zz  zz

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

Пахнет домашним заданием - формулировка вопроса похожа на задание?

The Archetypal Paul 09.11.2008 01:57

Stackoverflow предназначен для вопросов. Это заказ. если вы собираетесь попытаться заставить людей делать за вас домашнее задание, по крайней мере, постарайтесь, чтобы это не выглядело так =)

Oli 09.11.2008 02:03

1) Это не домашнее задание. 2) Вопрос подразумевается: вставьте «как мне» перед текстом вопроса.

Chris Conway 09.11.2008 02:32

Вы даже пытались это сделать? С какой частью вы боретесь?

TheSoftwareJedi 09.11.2008 02:33

@TheSoftwareJedi Часть, в которой некоторый метод, подобный printf, в JDK выполняет тяжелую работу за меня, вместо того, чтобы вручную возиться с пробелами.

Chris Conway 09.11.2008 02:41

На мой взгляд, вопрос резонный. Конечно, у него есть знания, чтобы создать алгоритм, выполняющий то, что он просит. По крайней мере, вы не можете получить 19,2 тысячи повторений только за то, что задаете домашние вопросы. Он просто просит путь Лучший. Зачем изобретать велосипед, если кто-то знает библиотеку? +1 за вопрос

Atmocreations 22.04.2013 14:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
6
14 707
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Возможно, необходимо сохранить длину самой длинной строки в каждом столбце, но в остальном она должна быть достаточно близкой. Кроме того, используйте printf для заполнения левого поля - вопрос был помечен как printf.

The Archetypal Paul 09.11.2008 01:59
Ответ принят как подходящий

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

Динамически генерируемые форматные строки ... По лбу ... :-)

Chris Conway 09.11.2008 03:45

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

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

Другие вопросы по теме