Форматирование toString Java

1

Я хотел бы знать, как форматировать toString: я пытался использовать printf и s tring.format но он хочет, чтобы я менял String и int в Object[]

Я хочу, чтобы это выглядело так: (пробелы)

Book1______Author1________850

Book23_____Author2424_____250

class Book
{
    private String title,author;
    private int numberOfPages;

    Book()
    {

    }

    public Book(String title, String author, int pages) {
        this.title = title;
        this.author = author;
        this.numberOfPages = pages;
    }

    public String toString()   
    {
        return(title + "%63s") + "\t" + (author + "%63s") + "\t" + numberOfPages;
        // It actually works but makes the "%63s" appear :o
    }
}
  • 2
    %63s - это просто строковый литерал, который вы объединяете. Вкладки добавляются с помощью "\t" , так что вы можете просто удалить %63s , но это, скорее всего, не %63s , если названия ваших книг и / или авторов имеют разную длину. Изменить: Вы пытаетесь привести в соответствие коллекцию книг? Если это так, вы не можете сделать это для отдельных методов toString.
  • 0
    Вы должны использовать String.format . В чем проблема?
Показать ещё 1 комментарий
Теги:
format
tostring

3 ответа

6
return String.format("%-30s%-30s%10d", title, author, numberOfPages);
  • 0
    Я уже пробовал это, он говорит: «Формат метода (Locale, String, Object []) в типе String не применим для аргументов (String, String, String, int)»: /
  • 0
    @ user3764862 Какую версию Java вы используете?
Показать ещё 1 комментарий
0

Строка правильная. Вам просто нужно правильно ввести строку форматирования.

Обновите свой метод toString() следующим образом:

public String toString()   
{
    return String.format("%63s\t%63s\t%10d", title, author, numberOfPages);
}

Первые %63s будут заменены title.

%63s будут заменены на author и добавить пробелы, чтобы сделать 63 символа в конце заголовка.

%10d будет заменено на numberOfPages и numberOfPages номер до 10 цифр.

0

Я не совсем уверен, хотите ли вы выровнять заголовки, авторы и количество страниц в трех отдельных столбцах. Но если вы сделаете это, вы не сможете этого добиться, переопределив метод toString Book, потому что он не будет знать, как долго названия и имена авторов других книг в коллекции.

Вы можете, однако, объявить пользовательскую коллекцию для своих книг и переопределить ее метод toString. Это может выглядеть следующим образом:

class Main {

static class Book
{
    private String title,author;
    private int numberOfPages;

    public Book(String title,String author,int pages) {
        this.title = title;
        this.author = author;
        this.numberOfPages = pages;
    }

    public String toString()
    {
        return String.format("%-30s%-30s%10d", title, author, numberOfPages);
    }

}

static class Library {

    public static final int Margin = 2;

    private List<Book> books = new ArrayList<Book>();
    public void addBook(Book book){
        books.add(book);
    }
    private int longestTitle() {
        int result = 0;
        for (Book book : books) {
            result = book.title.length() > result ? book.title.length() : result;
        }
        return result;
    }
    private int longestAuthor() {
        int result = 0;
        for (Book book : books) {
            result = book.author.length() > result ? book.author.length() : result;
        }
        return result;
    }

    public String toString() {
        String result = "";
        for (Book book : books) {
            int titleLength = book.title.length();
            result += book.title;
            for (int i = longestTitle(); i > titleLength - Margin; i--){
                result += " ";
            }
            result += book.author;
            int authorLength = book.author.length();
            for (int i = longestAuthor(); i > authorLength - Margin; i--){
                result += " ";
            }
            result += book.numberOfPages + "\n";
        }
        return result;
    }
}

public static void main(String[] args) {
    Library lib = new Library();
    Book b1 = new Book("Knights of the round table", "King Arthur", 123);

    lib.addBook(b1);
    Book b2 = new Book("It", "Stephen King", 1345);
    lib.addBook(b2);
    Book b3 = new Book("A very, very, very, very long title that seems pointless", "Me", 112);
    lib.addBook(b3); 
//  System.out.println(b1);
//  System.out.println(b2);
//  System.out.println(b3);
//  They do not align separately
    System.out.println(lib.toString());
}

}

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

Обратите внимание, что этот код написан не очень хорошо, но этого достаточно, чтобы передать идею.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню