【问题标题】:Formating an object array toString() output in Java在 Java 中格式化对象数组 toString() 输出
【发布时间】:2021-03-13 07:41:51
【问题描述】:

在调用.toString 方法时,我无法对齐对象数组[] 的输出。

System.out.println(books.toString());

并格式化我的.toString() 以获得像这样的对象变量的对齐方式

public static String header(){
    return "%1$-25s %2$-20s %3$-20s %4$-1s";
}
    
@Override
public String toString(){
    return String.format(header(), title, author, copies, "\n");
}

下面是我得到的结果,我想删除每行的第一个字符并让书名排成一行

[To Kill a Mockingbird     Harper Lee           30                   
, 1984                      George Orwell        3                    
, The Lord of the Rings     J.R.R. Tolkien       78                   
, The Book Thief            Markus Zusak         32                   
, The Grapes of Wrath       John Steinbeck       67                   
]

喜欢这个

To Kill a Mockingbird     Harper Lee           30                   
1984                      George Orwell        3                    
The Lord of the Rings     J.R.R. Tolkien       78                   
The Book Thief            Markus Zusak         32                   
The Grapes of Wrath       John Steinbeck       67

是否可以使用 .toString() 来执行此操作,或者我是否必须为每个对象使用一个循环来输出我的数据?

【问题讨论】:

  • 如果您不想在输出中出现[ , ] 字符,则必须编写自己的打印循环。或者使用Streamjoining()
  • 我想知道books.toString() 甚至给出了那个输出(books 是一个数组)
  • @user15358848 他在Book.toString() 中添加了一个新行,每本书的 toString 条目都会产生新行。 :p
  • @onkar 这不是重点。数组没有实现toString()方法(OP贴books.toString()),所以使用Object的版本,不输出数组的内容(例如见stackoverflow.com/q/409784/15358848

标签: java formatting output


【解决方案1】:

从您的代码中,我观察到您覆盖了对象类的 toString() 方法,因此在这种情况下,您应该使用 for 循环来打印每个对象,或者您可以创建一个新方法。新方法必须有一个循环打印所有对象

public string printAll(Book[] books){
//then for/while loop to iterate every element//
//then print
}

我认为这会奏效

【讨论】:

    【解决方案2】:

    如果你想打印books,它是一个Book的数组,你可以按照你想要的方式打印。

    System.out.println(Arrays.stream(books).map(Object::toString).collect(Collectors.joining()));
    

    【讨论】:

      【解决方案3】:

      books 的类型似乎是 List 或另一个集合,而不是书籍数组 Book[],如果它打印提到的输出。

      因此,如果 books 是一个可迭代的集合,则可以使用其方法 forEach 而不是循环:

      books.forEach(System.out::println);
      

      或者,如果books需要转换成单个String,Collectors.joining应该使用评论中提到的Andreas:

      String toPrint = books.stream().map(Book::toString).collect(Collectors.joining("\n"));
      

      【讨论】:

      • 非常感谢亚历克斯。它效果很好,而且很容易实现。
      【解决方案4】:

      在 Book 类中创建一个静态方法:

      public static void prettyPrintBooks(Book[] books) {
        //print header
      
        for(Book b : books){
           //print each book row
        }
      
      }
      

      你可以像这样调用这个方法:Book.prettyPrintBooks(books);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-16
        • 1970-01-01
        相关资源
        最近更新 更多