如何使用递归打印对象数组?

时间:2017-11-08 00:48:44

标签: java arrays recursion

我将创建一个Book类的数组,我不相信Book类的内容,但我已经实现了Comparable,尽管在这个确切的例子中并不需要使用它。我需要返回一个String字符串。在过去的示例中,我们总是这样做,因此它是无效的但使用System.out.println。我对整个递归的掌握程度很低,所以如果有人能提供帮助,我会非常感激。谢谢

2 个答案:

答案 0 :(得分:0)

递归不是解决此问题的正确策略。这听起来像是在寻求家庭作业帮助,所以我建议您在学校学习TA或其他资源,以便更好地理解问题的背景。既然你提到过:打印数组不需要实现Comparable。如果您打算排序数组,则需要Comparable

那就是说,这是你需要的组件:

  1. 您的Book类需要字符串表示。在Java中,规范地使用toString方法对其进行编码:

    class Book
    {
       private String title;
    
       // ...other Book methods defined here...
    
       public String toString()
       {
           return this.title; // Or whatever the correct string representation of your Book is.
       }
    }
    
  2. 我假设你已经初始化了Book的数组,比如你的main函数。通常,您会迭代地打印列表。它简单得多。请参阅此答案:How to print out individual Strings from Iterable<String>

    但是,您的问题特定于递归。递归函数总是需要两个元素:

    1. 基本案例
    2. 递归步骤
    3. 递归迭代列表在函数式编程中很常见,其中常见的基本情况是空列表。 Java数组不适合这种模式,尽管List之类的LinkedList实现是一些for。也就是说,我们可以通过使递归步骤递增计数器来使用数组。与在public String stringifyBooks(Book[] books, int currentIndex) { // From https://stackoverflow.com/questions/47169798/how-to-print-an-array-of-objects-using-recursion if (currentIndex >= books.length || currentIndex < 0) { // Base case return ""; } else { // Recursive step return books[currentIndex].toString() + ", " + stringifyBooks(books, currentIndex + 1); } } 循环中迭代列表相比,这几乎没有优势,并且具有容易出现堆栈溢出的主要缺点。但是,你要求递归......

      stringifyBooks

      现在,您可以使用Book数组和初始索引调用", ",您将获得从该索引开始的所有书籍串。如果您传递的初始索引大于书籍数组的长度,或者书籍是否为空数组,会发生什么?

      当您亲自尝试时,您可能会注意到此解决方案会产生尾随for。为避免这种情况,您可以尝试(a)调整基本情况(或添加第二个“基本情况”),或者您可以(b)调整递归步骤以确定何时使用递归函数调用命中基本情况(提示) :在递归步骤中检查基本案例和帐户返回的值。

      使用递归会受到Java堆栈大小限制的影响。在很长的一系列书籍(比如10,000个)上尝试它,你可能会遇到这些限制。而且,所有字符串连接的成本都非常大。顺便提一下,如果您在迭代算法(即使用StringBuilder循环的算法)中累积了字符串,您将支付该费用。出于这个原因,Java提供了内置的StringBuilder。看看你是否可以修改上面的代码,在递归步骤中为每本书提供append+,而不是使用void运算符在每个递归步骤中连接字符串。 (请注意,此修改意味着stringifyBooks将返回String而不是StringBuilder - 您的List<Book>参数最终将成为您的返回值。)

      最后,如果您打算使用Book[]而不是List,您可以构造一个递归函数,其中:(1)基本案例检查isEmpty的{​​{1}函数并返回""; (2)递归情况创建列表中第一个元素的字符串,删除第一个元素,调用列表上的递归函数,然后返回第一个元素的字符串+递归函数调用的结果。 (或使用StringBuilder执行相同的操作。)如果执行此操作,则会删除currentIndex变量。请记住,这会破坏您的书籍列表,因此如果您在使用该功能后需要它,则需要在调用递归函数之前克隆它。

答案 1 :(得分:-1)

要从方法标题中的方法返回一个字符串:

public String getName(){
    return this.name;
}

如果要返回Object的String表示,则约定是使用.toString()方法。 String.format()对此非常有帮助。

public String toString(){
    return String.format("Name: %s Number of pages: %d", this.name, this.numPages);
}

编辑:

使用递归打印这些对象的数组:

public static String arrayAsString(Book[] books, int startIndex){
    if(startIndex > books.length - 1) return null;

    String toAppend = arrayAsString(books, startIndex + 1);

    if(toAppend == null) return books[startIndex].toString();
    else return books[startIndex].toString() + " " + toAppend;
}