【问题标题】:Declaring an array of strings that can be directly printed Java声明一个可以直接打印的字符串数组 Java
【发布时间】:2015-12-05 16:50:38
【问题描述】:

鉴于这个类:

public class Book {
    private String bookName;
    private String[] chapters = new String[9];
    private int numberOfChapters;

    public Book(String bn){
        bookName = bn;
    }
    public Book(String b[]){
        chapters = b;
    }
    public void addChapter(String chapter){
        chapters[numberOfChapters] = chapter;
        numberOfChapters++;
    }
    public String[] getChapter(){
        return chapters;
    }
    public int getNumberOfChapters(){
        return numberOfChapters;
    }
    public String getBookName(){
        return bookName;
    }
    public String toString(){
        return("Book Name: " + getBookName() + " chapters[] = " + getChapter() + " number of chapters :  " + getNumberOfChapters());
    }

}

我需要编写一个驱动程序来创建一个章节数组(字符串),然后将其中的每个对象分配给 Book 对象。我的问题是,当我这样做时,toString() 方法不能正确打印章节,而是返回内存地址。

这是我目前所拥有的:

public class BookTest {

    public static void main(String[] args) {
        String[] BookArray = new String[9];
        for(int i = 0; i<BookArray.length; i++){
            BookArray[i] = new String("Chap"+(i+1));
        }
        Book b1 = new Book("Name1");
        for(int i=0; i<BookArray.length; i++){
            b1.addChapter(BookArray[i]);
        }
        System.out.println(b1.toString());
    }
}

打印出来的

Book Name: Name1 chapters[] = [Ljava.lang.String;@2a139a55 number of chapters :  9

在不更改 toString() 方法的情况下,我需要在驱动程序中进行哪些更改才能正确打印章节?

【问题讨论】:

  • 使用List&lt;String&gt; 而不是String[]
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已根据 CC BY-SA license 授予 SE 分发内容的不可撤销权利(即无论您未来的选择如何)。根据 SE 政策,分发非破坏版本。因此,任何破坏行为都将被撤销。请参阅:How does deleting work? …。如果允许删除,则帖子下方左侧有一个“删除”按钮,但仅在浏览器中,而不是移动应用程序中。

标签: java arrays object


【解决方案1】:

在您的toString 方法中使用Arrays.toString(getChapter())。我宁愿使用List&lt;String&gt; 而不是字符串数组,这样更容易在书中添加和删除章节。或者可能是 Map&lt;int, String&gt;,这样您就可以添加带有 ID(例如第 12 章)和每个章节名称的章节。

【讨论】:

  • 有什么方法可以让它在不修改类的情况下工作?
  • @agsl 不,不改变BooktoString 方法。打印 Array 时,打印的是内存地址,而不是 Array 的内容。
【解决方案2】:

使用函数

Arrays.toString(chapters)

得到一个不错的输出。

【讨论】:

  • 也提供某种解释来支持您的回答。
【解决方案3】:

数组是Java中的对象。

Java 语言规范写道:

在 Java 编程语言中,数组是对象(第 4.3.1 节),是动态创建的,并且可以分配给 Object 类型的变量(第 4.3.2 节)。 Object 类的所有方法都可以在数组上调用。

因此Ljava.lang.String;@2a139a55 被打印出来。

参考Is it possible in Java to override 'toString' for an Objects array?

【讨论】:

    【解决方案4】:

    getChapters() 函数返回内存地址,不打印数组。

    为此,首先:

     import java.util.Arrays;
    

    然后:

    使用 Arrays 类的 toString() 方法在输出中返回数组的字符串格式。

     public String toString(){
        return("Book Name: " + getBookName() + 
               " chapters[] = " + Arrays.toString(getChapter()) +
               " number of chapters :  " + getNumberOfChapters());
     }
    

    【讨论】:

      【解决方案5】:

      这可以通过多种方式实现...

      1)

      Arrays.toString(chapters)
      

      得到一个不错的输出。

      2)

      你也可以使用:-

      Arrays.asList(getChapter())
      

      3) 代替 String[] 使用 List...以这种方式...自动 toString 将以正确的格式打印它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-11
        • 2013-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        • 2021-08-20
        相关资源
        最近更新 更多