两种标记的方法有什么区别?它们的输出是否相同?
What is the difference between the two marked methods? Are their outputs the same?
这段代码在我必须解决的练习中受到质疑。虽然我的代码显示了正确的结果(版本一),但我不确定它是否与提供的解决方案(版本二)一样好,或者它是否完全正确。任务是写一个class,代表一本书和使用自引用向前和向后翻页的方法。
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();
}
}
下面的demo-class很简单,展示了方法的执行:
public class BookDemo {
public static void main(String[] args) {
Book.pageBackward1(500, 455);
System.out.println();
Book.pageBackward2(500, 455);
}
}
如您所说,解决方案是等效的(字面意思!在相同的输入数据上,它们输出相同的数据,尽管通过标准输出而不是 return 值)。
我认为,由于提供的解决方案,练习的建议是 pre-fill/pre-generate Book
,然后使用 getNextPage()
getter 逐步完成它们。我相信你已经得出了相同的结论,因为你做了几乎相同的事情,但顺序不同,单步执行实例一次,但在创建它们时(而不是,例如,单步执行所有现有的 Books
在创建下一个之前到达最后一个)。
在我看来,由于这些不稳定的语义和不明确的目标,这个练习根本无法教授很多东西,而且对于学生来说,直接开始使用更明确命名和通用的数据会更有成效 linked list结构。
这段代码在我必须解决的练习中受到质疑。虽然我的代码显示了正确的结果(版本一),但我不确定它是否与提供的解决方案(版本二)一样好,或者它是否完全正确。任务是写一个class,代表一本书和使用自引用向前和向后翻页的方法。
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();
}
}
下面的demo-class很简单,展示了方法的执行:
public class BookDemo {
public static void main(String[] args) {
Book.pageBackward1(500, 455);
System.out.println();
Book.pageBackward2(500, 455);
}
}
如您所说,解决方案是等效的(字面意思!在相同的输入数据上,它们输出相同的数据,尽管通过标准输出而不是 return 值)。
我认为,由于提供的解决方案,练习的建议是 pre-fill/pre-generate Book
,然后使用 getNextPage()
getter 逐步完成它们。我相信你已经得出了相同的结论,因为你做了几乎相同的事情,但顺序不同,单步执行实例一次,但在创建它们时(而不是,例如,单步执行所有现有的 Books
在创建下一个之前到达最后一个)。
在我看来,由于这些不稳定的语义和不明确的目标,这个练习根本无法教授很多东西,而且对于学生来说,直接开始使用更明确命名和通用的数据会更有成效 linked list结构。