Вот небольшой совет. Поскольку вы создаете таблицу с заголовком, описывающим каждый столбец, сначала отформатируйте этот заголовок так, как вы хотите, чтобы таблица отображалась. Это в основном даст вам действительно хорошее представление о том, как форматировать все ваши данные, которые будут отображаться в этой таблице (могут быть применены некоторые незначительные улучшения).
Вместо того, чтобы просто печатать строку заголовка и разделять имена столбцов пробелами ( "" ) или символами табуляции ( "\ t" ) {небесный предвест}, используйте метод String # format () . Я говорю метод String # format () вместо метода Console # printf () , потому что мы хотим, чтобы длина заголовка была позже для создания подчеркивания под этим заголовком. Вот пример:
String header = String.format("%-6s %-15s %-10s %-4s", "ID", "Name", "Price", "Quantity");
System.out.println(header);
// Underline Header. Using the String#join() method for this.
System.out.println(String.join("", Collections.nCopies(header.length(), "=")));
Выход консоли будет выглядеть примерно так:
ID Name Price Quantity
==========================================
Это выглядит довольно неплохо, мы будем его использовать. Для создания подчеркивания заголовка мы используем метод String # join () вместе с методом Collections # nCopies () .
Теперь пришло время отобразить данные таблицы под заголовком в том же формате. Для этого используйте только 'one' printf () в вашем для l oop, например:
for (int i = 0; i < itemList.size(); i++) {
System.out.printf("%-6d %-15s £%-10.2f %-4d%n",
itemList.get(i).id,
itemList.get(i).name,
itemList.get(i).price,
itemList.get(i).quantity);
}
Обратите внимание на формат строка , используемая в методе printf () , идентична строке формата , используемой в методе String # format () , за исключением того, что * Строка формата 1040 * printf () также содержит тег % n . Этот тег используется для генерации c разделителя строк, определяемого платформой, поскольку мы хотим, чтобы следующая итерация для l oop была напечатана на новой строке в окне консоли. С данными, которые вы указали в своем посте, вывод на консоль должен выглядеть примерно так:
ID Name Price Quantity
==========================================
1 Coke £0.70 5
2 Fanta £0.60 5
3 Galaxy £1.20 5
4 Snickers £1.00 5
5 Dairy Milk £1.30 5
Это выглядит хорошо, но было бы неплохо, если бы значение Количество было немного больше центрировано под именем заголовка ' Количество'. Это можно сделать, изменив общий интервал для использования тега для обозначения «Цена», чтобы сделать его чуть шире. Просто добавьте 2 к этому строковому тегу формата, чтобы сделать его 12 вместо 10 , например:
for (int i = 0; i < itemList.size(); i++) {
System.out.printf("%-6d %-15s £%-12.2f %-4d%n",
itemList.get(i).id,
itemList.get(i).name,
itemList.get(i).price,
itemList.get(i).quantity);
}
Теперь вывод будет выглядеть так:
ID Name Price Quantity
==========================================
1 Coke £0.70 5
2 Fanta £0.60 5
3 Galaxy £1.20 5
4 Snickers £1.00 5
5 Dairy Milk £1.30 5
Вот вам go. Возможно, вы заметили, что данные, которые я перебираю, содержатся в коллекции. Я думаю, что использование массива ArrayList или List Interface лучше использовать вместо массива, поскольку эти списки могут увеличиваться по мере необходимости, а не для предварительной инициализации до определенного размера c, например, для массива.
Вот класс VendItem , который я использовал для этих демонстраций:
import java.util.Collections;
public class VendItem {
private int id;
private String name;
private float price;
private int quantity;
public static String HEADER = getHeader();
public VendItem() { }
public VendItem(int id, String name, float price, int quantity) {
this.id = id;
this.name = name;
this.price = price;
this.quantity = quantity;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
@Override
public String toString() {
return "id=" + id + ", name=" + name + ", price=" + price + ", quantity=" + quantity;
}
private static String getHeader() {
HEADER = String.format("%-6s %-15s %-10s %-4s", "ID", "Name", "Price", "Quantity") +
System.lineSeparator();
HEADER += String.join("", Collections.nCopies(HEADER.length(), "="));
return HEADER;
}
public String toFormattedString() {
return String.format("%-6d %-15s £%-12.2f %-4d", id, name, price, quantity);
}
}
А вот код, который я использовал для отображения демонстраций:
List<VendItem> itemList = new ArrayList<>();
itemList.add(new VendItem(1, "Coke", 0.70f, 5));
itemList.add(new VendItem(2, "Fanta", 0.60f, 5));
itemList.add(new VendItem(3, "Galaxy", 1.20f, 5));
itemList.add(new VendItem(4, "Snickers", 1.00f, 5));
itemList.add(new VendItem(5, "Dairy Milk", 1.30f, 5));
// Display Title
System.out.println("List All Items");
System.out.println("++++++++++++++");
System.out.println()
// Display Table Header.
String header = String.format("%-6s %-15s %-10s %-4s", "ID", "Name", "Price", "Quantity");
System.out.println(header);
// Underline the Header.
System.out.println(String.join("", Collections.nCopies(header.length(), "=")));
// Display Table Data...
for (int i = 0; i < itemList.size(); i++) {
System.out.printf("%-6d %-15s £%-12.2f %-4d%n",
itemList.get(i).id,
itemList.get(i).name,
itemList.get(i).price,
itemList.get(i).quantity);
}
РЕДАКТИРОВАТЬ: просто еще одна мысль:
Вы можете сделать так, чтобы ваш VendItem класс возвращал заголовок и форматированные строки данных, такие как toString () метод. Предоставленный класс уже содержал метод toString () , но если вы добавили метод toFormatedString () , то это делает отображение на консоли намного проще. Я добавил HEADER Поле к классу и toFormattedString () . С помощью этих дополнительных предметов класса ваша таблица может отображаться на консоли следующим образом:
List<VendItem> itemList = new ArrayList<>();
itemList.add(new VendItem(1, "Coke", 0.70f, 5));
itemList.add(new VendItem(2, "Fanta", 0.60f, 5));
itemList.add(new VendItem(3, "Galaxy", 1.20f, 5));
itemList.add(new VendItem(4, "Snickers", 1.00f, 5));
itemList.add(new VendItem(5, "Dairy Milk", 1.30f, 5));
System.out.println("List All Items");
System.out.println("++++++++++++++");
System.out.println();
System.out.println(VendItem.HEADER);
for (VendItem item : itemList) {
System.out.println(item.toFormattedString());
}
Намного проще, не правда ли.