如何通过算法有条件地更新计数器Java

时间:2018-04-17 04:45:46

标签: java algorithm for-loop counter decrement

这个问题有点令人困惑所以我会尝试通过代码和示例来解释。

如果计数器符合条件,我该怎么减少?听起来很简单吧?但是,如果从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条件不再为真且第一个条件是的,所以写错了页码

2 个答案:

答案 0 :(得分:2)

问题在于,在当前代码中,变量currentPageNototalPageCount位于堆栈中,这意味着在方法返回后它们的值将被丢弃。解决问题的一种方法是将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)页面对象;每个对象都有自己的currentPagetotalPageCount,如下所示:
对象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对象。看看它是如何使事情复杂化的?!