这个问题有点令人困惑所以我会尝试通过代码和示例来解释。
如果计数器符合条件,我该怎么减少?听起来很简单吧?但是,如果从for循环中继续引发该方法以便将值传递给它,那么该怎么办呢?
Eample: 我有一个包含多个页面的文档,但是其中一些页面是空白的,我不想计算它们。
对于5页文档,第一页为空白。我想完成以下行为:
page 1: nothing...
page 2: 1 of 4
page 3: 2 of 4
page 4: 3 of 4
page 5: 4 of 4
目前,它包含空白页面作为页数的一部分。
以下是代码示例:
static main() {
// et cetera
for(Page page : pages) {
int pageNumber = page.getPageNo();
int pageCount = page.getTotalPageCount();
form.getTemplate().writePageNumber(page, pageNumber,pageCount);
}
}
所以在主例程中我从for循环中调用一个名为writePageNumber()
的方法,在其中传入currentPageNumber和totalPage计数。
public boolean writePageNumber(Page page, int currentPageNo, int totalPageCount) {
if ( !page.isBlank() ) {
this.write(currentPageNo, totalPageCount);
}
else if ( page.isBlank() ){
currentPageNo--;
totalPageCount--;
}
// et cetera
}
现在在writePageNumber()方法中,我获得了页面上下文和我的处理。我检查页面是否为空白然后我写了totalPages的currentPage,如果它是空白然后我减少currentPage否和totalPage计数...以便不计算空白页...这是正确的方法去做吧?不确定
由于该方法是在for循环中调用的,因此我递减后的值会被重置,如何保持递减的值?
可能有更好的方法来做到这一点,任何帮助将不胜感激。
编辑:
为了清楚起见,问题是从for循环调用writePageNumber(),因此下次调用writePageNumber时,值将被重置,因此在第二次迭代期间,else if条件不再为真且第一个条件是的,所以写错了页码
答案 0 :(得分:2)
问题在于,在当前代码中,变量currentPageNo
和totalPageCount
位于堆栈中,这意味着在方法返回后它们的值将被丢弃。解决问题的一种方法是将writePageNumber
的正文提取到for
循环中。所以,而不是像,
Page page = /* ... */
int totalPages = 5;
for (int currentPage = 1; currentPage <= totalPages; i++) {
writePageNumber(page, currentPage, totalPages);
};
您的代码可能如下所示:
Page page = /* ... */
int totalPages = 5;
for (int currentPage = 1; currentPage <= totalPages; i++) {
if (!page.isBlank()) {
// ...
} else {
currentPage--;
totalPages--;
}
// ...
}
编辑:您提到没有破坏代码模式,但在这种情况下您可能不得不妥协。目前,您期望writePageNumber
是一个带有两个整数参数的函数,修改它们,并为下一个函数调用返回它们的更新值以某种方式。您无法从Java中的函数返回多个值。您需要在方法调用中保持这些值,因此它们需要在方法范围之外声明(或者,就像我建议的那样,将方法提取到循环中),这意味着使用字段
答案 1 :(得分:1)
以下我认为问题是:
你有一些(5)页面对象;每个对象都有自己的currentPage
和totalPageCount
,如下所示:
对象1:Page: current = 1; total = 5;
对象2:Page: current = 2; total = 5;
对象3:Page: current = 3; total = 5;
对象4:Page: current = 4; total = 5;
对象5:Page: current = 5; total = 5;
在您的代码中,您正在更新current
&amp; total
(不在对象中,但只在本地使用它们的上下文中),但这些值不会在剩余的对象中更新; for
循环遍历这些未更新的剩余对象
我建议你做这样的事情:
private int blanks = 0;
public boolean writePageNumber(Page page, int currentPageNo, int totalPageCount) {
if ( page.isBlank() ) {
blanks++;
// etcetera
} else {
this.write(currentPageNo - blanks, totalPageCount - blanks);
}
// et cetera
}
您应首先遍历所有网页以获取总空白页面,以便获得固定的totalPageCount
,然后移除上方- blanks
中的totalPageCount - blanks
,然后您就可以了我会得到这样的数据:
对象1:Page: current = 1; total = 5;
对象2:Page: current = BLANK; total = 5;
对象3:Page: current = 2; total = 4;
对象4:Page: current = BLANK; total = 4;
对象5:Page: current = 3; total = 3;
注意总数是如何变化的。
还有一点需要注意的是,totalPageCount不是页面的属性,因此不应属于Page
对象,而应属于book对象。看看它是如何使事情复杂化的?!