【问题标题】:What is the difference between the two marked methods? Are their outputs the same?这两种标记方法有什么区别?它们的输出是否相同?
【发布时间】:2016-01-27 11:57:21
【问题描述】:

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

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);
    }
} 

【问题讨论】:

  • 你运行并检查了吗?
  • 调用 Book 一个代表页面的类的语义是什么(也在“提供的解决方案”中!)?
  • @Stultuske 我运行并检查了程序。输出查找两个版本,如下所示: 第 500 页 第 499 页 第 498 页 ... 第 455 页
  • @Matt 这个语义对我来说也有点奇怪。 Book 类由页码定义,这就是为什么将实例称为 page 或 previousPage 或 nextPage 的原因。如果我要定义这个练习,我会做不同的,但我只是复制它。

标签: java self-reference


【解决方案1】:

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

我相信由于提供的解决方案,练习的建议是在使用 getNextPage() getter 逐步完成之前预填充/预生成 Books。我相信您已经得出了相同的结论,因为您做了几乎相同的事情,但顺序不同,只在创建实例时单步执行一次(而不是,例如,单步执行所有现有的 Books 到在创建下一个之前到达最后一个)。

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

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2011-01-10
    • 2016-07-01
    • 2013-08-08
    相关资源
    最近更新 更多