此代码在我必须解决的练习中受到质疑。虽然我的代码显示了正确的结果(版本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);
}
}
答案 0 :(得分:0)
正如您所说,解决方案是等效的(字面意思是!在相同的输入数据上,它们输出相同的数据,尽管通过stdout而不是返回值)。
我相信由于提供的解决方案,练习的提议是在使用Book
getter逐步填充/预生成getNextPage()
之前预先生成Books
s。我相信你已经得出了相同的结论,因为你做了几乎相同的事情,但是以不同的顺序,在你创建它们时踩过一次实例(相反,例如,踩过所有现有的{{ 1}}在创建下一个之前到达最后一个。)
在我看来,由于这些不稳定的语义和目标不明确,这项练习根本无法教授,而且学生开始直接使用更明确命名和通用的linked list数据结构会更有效率。