Не могу доработать ConsoleTableWriter

Не могу доработать ConsoleTableWriter так, чтобы длина левой колонки была одинаковой для всех строк и равна длине самой большой.

public class Row {
    public String left;
    public  String right;

    public Row(String left,String right) {
        this.left = left;
        this.right = right;
    }
}
public class ConsoleTableWriter implements TableWriter {

    @Override
    public void writeTable(Row[] table) {
        for (int i = 0; i < table.length; i++) {
            Row current = table[i];
            int max = 0;
            if (table[i].left.length() > max) {
                max = table[i].left.length();
            }
            current.left.length() = max;

            System.out.println(current.left + "\t\t" + "|" + "\t\t" + current.right);
        }
    }

    @Override
    public String getOutputPlace() {
        return "console";
    }
}
public class TableScanner {
    Row[] scanTable() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("please enter header, left column");
        String headerLeft = scanner.nextLine();
        System.out.println("please enter header, right column");
        String headerRight = scanner.nextLine();
        Row header = new Row(headerLeft,headerRight);
        System.out.println("how many rows you will have in table: ");
        int rowsCount = scanner.nextInt();

        Row[] table = new Row[rowsCount + 1];
        table[0] = header;

        for (int i = 1; i < rowsCount + 1; i++) {
            System.out.println("Enter " + i + " row:");
            System.out.println("Left: ");
            String left = scanner.next();
            System.out.println("Right: ");
            String right = scanner.next();
            Row row = new Row(left,right);
            table[i] = row;
       }
       return table;
   }
}
public interface TableWriter {
    void writeTable(Row[] table);

    String getOutputPlace();
}
public class MyClass1 {
    public static void main(String[] args) throws IOException {
        TableScanner tableScanner = new TableScanner();
        System.out.println("Please enter table: ");

        Row[]table =  tableScanner.scanTable();
        TableWriter tableWriter = new ConsoleTableWriter();
        tableWriter.writeTable(table);

        System.out.println("Table written to..." + tableWriter.getOutputPlace());
    }
}

Ответы (1 шт):

Автор решения: Nowhere Man
  1. Сначала ищется максимальная ширина -- в данном случае можно искать её для обеих колонок класса Row
  2. Затем используется форматированный вывод при помощи System.out.printf и указанием ширины полей %-{width}s (знак "-" используется для выравнивания строк по левому краю).
@Override
public void writeTable(Row[] table) {
    int maxL = -1;
    int maxR = -1;
    for (int i = 0; i < table.length; i++) {
        Row current = table[i];
        maxL = Math.max(maxL, current.left.length());
        maxR = Math.max(maxR, current.right.length());
    }
    // формат с тремя вертикальными линиями
    String format = "| %-" + maxL + "s | %-" + maxR + "s |%n";
    for (int i = 0; i < table.length; i++) {
        Row current = table[i];
        System.out.printf(format, current.left, current.right);
    }
}

Пример:

new ConsoleTableWriter().writeTable(
    new Row[] {
        new Row("aaa", "bbbb"),
        new Row("aaaaa", "bbbbbbbb"),
        new Row("aaa aaa", "bbbb bbbb"),
        new Row("aaaa", "bbb"),
        new Row("a", "b"),
        new Row("aa", "bbbb")
    }
);

Результат:

| aaa     | bbbb      |
| aaaaa   | bbbbbbbb  |
| aaa aaa | bbbb bbbb |
| aaaa    | bbb       |
| a       | b         |
| aa      | bbbb      |

→ Ссылка