Проблема с форматированием, вывод не совпадает - PullRequest
0 голосов
/ 02 апреля 2020

У меня проблема с форматом, и я не уверен, как ее исправить.

В основном я получаю вывод:

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 

, и я ищу все, чтобы выстроиться правильно.

Вот мой код:

    public void itemList() {
    VendItem[] itemList = stock;

    System.out.println("List All Items");
    System.out.println("++++++++++++++\n");
    System.out.println("ID\t" + "Name\t   " + "Price\t" + "Quantity");
    for (int i = 0; i < itemCount; i++) {

        System.out.print(i + 1 + "\t");
        System.out.print(itemList[i].getName() +"\t   ");

        System.out.printf("£%.2f", itemList[i].getPrice());
        System.out.print("\t");
        System.out.print(itemList[i].getQty() +"\n");
    }

1 Ответ

3 голосов
/ 03 апреля 2020

Вот небольшой совет. Поскольку вы создаете таблицу с заголовком, описывающим каждый столбец, сначала отформатируйте этот заголовок так, как вы хотите, чтобы таблица отображалась. Это в основном даст вам действительно хорошее представление о том, как форматировать все ваши данные, которые будут отображаться в этой таблице (могут быть применены некоторые незначительные улучшения).

Вместо того, чтобы просто печатать строку заголовка и разделять имена столбцов пробелами ( "" ) или символами табуляции ( "\ 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());
}

Намного проще, не правда ли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...