两种标记方法有什么区别?他们的输出是否相同?

时间:2016-01-27 11:57:21

标签: java self-reference

此代码在我必须解决的练习中受到质疑。虽然我的代码显示了正确的结果(版本1),但我不确定它是否与提供的解决方案(版本2)一样好,或者它是否正确。任务是编写一个代表书籍的类和使用自引用向前和向后翻页的方法。

public class Book {

    private int page;
    private Book nextPage;

    public Book(int page) {
        setPage(page);
        setNextPage(null);
    }

//Getter and Setter

    public void setPage(int page){
        this.page = page;   
    }

    public int getPage() {
        return this.page;
    }

    public void setNextPage(Book nextPage) {
        this.nextPage = nextPage;
    }

    public Book getNextPage() {
        return nextPage;
    }

/*The following methods are getting two int values and should page backward, showing each page number. */

第一版:

    public static void pageBackward1(int currentPage, int goalPage) {
        Book page = new Book(currentPage);
        System.out.print("Page " + page.getPage() + " ");
        while(goalPage != page.getPage()) {
            currentPage--;
            page.nextPage = new Book(currentPage);
            page = page.nextPage;
            System.out.print("Page " + page.getPage() + " ");
        }
    }

第二版:

    public static void pageBackward2(int currentPage, int goalPage) {
        Book previousPage = null;
        for(int i = currentPage; i <= goalPage; i++) {
            Book page = new Book(i);
            page.setNextPage(previousPage);
            previousPage = page;
        }
        Book page = previousPage;
        while(page != null) {
            System.out.print("Page " + page.getPage() + " ");
            page = page.getNextPage();
        }
        System.out.println();
     }
}

以下演示类很简单,并显示了方法的执行情况:

public class BookDemo {

    public static void main(String[] args) {
        Book.pageBackward1(500, 455);
        System.out.println();
        Book.pageBackward2(500, 455);
    }
} 

1 个答案:

答案 0 :(得分:0)

正如您所说,解决方案是等效的(字面意思是!在相同的输入数据上,它们输出相同的数据,尽管通过stdout而不是返回值)。

我相信由于提供的解决方案,练习的提议是在使用Book getter逐步填充/预生成getNextPage()之前预先生成Books s。我相信你已经得出了相同的结论,因为你做了几乎相同的事情,但是以不同的顺序,在你创建它们时踩过一次实例(相反,例如,踩过所有现有的{{ 1}}在创建下一个之前到达最后一个。)

在我看来,由于这些不稳定的语义和目标不明确,这项练习根本无法教授,而且学生开始直接使用更明确命名和通用的linked list数据结构会更有效率。