Как условно обновить счетчик алгоритмически Java
Этот вопрос немного запутан, поэтому я попытаюсь объяснить с помощью кода и примера.
Как я могу уменьшить счетчик, если он удовлетворяет условию? Звучит просто так? Но что делать, если этот метод непрерывно вызван из цикла 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);
}
}
Поэтому в основной подпрограмме я writePageNumber()
метод с именем writePageNumber()
из цикла for, в котором я передаю текущее число_PageNumber и 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(), я получаю контекст страницы и обрабатываю. Я проверяю, не является ли страница пустой, тогда я пишу currentPage totalPages, если она пуста, тогда я уменьшаю текущее число No и totalPage count... чтобы не считать пустую страницу... это правильный путь сделать это? Точно сказать не могу
Поскольку метод вызывается из цикла for, значения после того, как я уменьшаю их, получают сброс, как поддерживать декрементированные значения?
Вероятно, есть лучший способ сделать это, любая помощь будет оценена по достоинству.
Редактировать:
Для ясности проблема заключается в том, что writePageNumber() вызывается из цикла for, поэтому при следующем вызове writePageNumber значения сбрасываются, поэтому во время второй итерации else, если условие больше не истинно и первое условие истинно, неправильный номер страницы написан
Проблема заключается в том, что в текущем коде переменного 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--;
}
// ...
}
Edit: Вы упомянули, что не нарушаете шаблоны кода, но в этом случае вам, возможно, придется идти на компромисс. В настоящее время вы ожидаете, что writePageNumber
будет функцией, которая принимает два целочисленных аргумента, модифицирует их и как-то возвращает свои обновленные значения для следующего вызова функции. Вы не можете вернуть несколько значений из функции в Java. Вам нужно, чтобы эти значения сохранялись в вызовах методов, поэтому их нужно объявлять вне области действия метода (или, как я уже сказал, вы извлекаете метод в цикл), что означает использование поля.
Вот что я считаю проблемой:
У вас есть число (5) объектов страницы; каждый объект имеет свой собственный currentPage
и totalPageCount
следующим образом:
Объект 1: Page: current = 1; total = 5;
Page: current = 1; total = 5;
Объект 2: Page: current = 2; total = 5;
Page: current = 2; total = 5;
Объект 3: Page: current = 3; total = 5;
Page: current = 3; total = 5;
Объект 4: Page: current = 4; total = 5;
Page: current = 4; total = 5;
Объект 5: Page: current = 5; total = 5;
Page: current = 5; total = 5;
В вашем коде вы обновляете current
и 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
выше, orelse вы получите такие данные:
Объект 1: Page: current = 1; total = 5;
Page: current = 1; total = 5;
Объект 2: Page: current = BLANK; total = 5;
Page: current = BLANK; total = 5;
Объект 3: Page: current = 2; total = 4;
Page: current = 2; total = 4;
Объект 4: Page: current = BLANK; total = 4;
Page: current = BLANK; total = 4;
Объект 5: Page: current = 3; total = 3;
Page: current = 3; total = 3;
Обратите внимание, как общее число изменений меняется.
Еще одна вещь, которую следует отметить, заключается в том, что totalPageCount не является свойством страницы и, следовательно, не должен принадлежать объекту " Page
, а скорее к объекту книги. Смотрите, как это усложняет ситуацию?!