Не могу доработать 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
→ Ссылка
- Сначала ищется максимальная ширина -- в данном случае можно искать её для обеих колонок класса
Row - Затем используется форматированный вывод при помощи
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 |