Я хотел бы знать, как форматировать 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
}
}
return String.format("%-30s%-30s%10d", title, author, numberOfPages);
Строка правильная. Вам просто нужно правильно ввести строку форматирования.
Обновите свой метод toString()
следующим образом:
public String toString()
{
return String.format("%63s\t%63s\t%10d", title, author, numberOfPages);
}
Первые %63s
будут заменены title
.
%63s
будут заменены на author
и добавить пробелы, чтобы сделать 63 символа в конце заголовка.
%10d
будет заменено на numberOfPages
и numberOfPages
номер до 10 цифр.
Я не совсем уверен, хотите ли вы выровнять заголовки, авторы и количество страниц в трех отдельных столбцах. Но если вы сделаете это, вы не сможете этого добиться, переопределив метод 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());
}
}
Идея состоит в том, чтобы посмотреть, какой заголовок является самым длинным, и добавить для каждой книги вы хотите напечатать отступы, которые достигают, по крайней мере, самого длинного названия. То же самое для автора.
Обратите внимание, что этот код написан не очень хорошо, но этого достаточно, чтобы передать идею.
%63s
- это просто строковый литерал, который вы объединяете. Вкладки добавляются с помощью"\t"
, так что вы можете просто удалить%63s
, но это, скорее всего, не%63s
, если названия ваших книг и / или авторов имеют разную длину. Изменить: Вы пытаетесь привести в соответствие коллекцию книг? Если это так, вы не можете сделать это для отдельных методов toString.String.format
. В чем проблема?