Как условно обновить счетчик алгоритмически Java

60
8

Этот вопрос немного запутан, поэтому я попытаюсь объяснить с помощью кода и примера.

Как я могу уменьшить счетчик, если он удовлетворяет условию? Звучит просто так? Но что делать, если этот метод непрерывно вызван из цикла 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, если условие больше не истинно и первое условие истинно, неправильный номер страницы написан

спросил(а) 2018-04-17T07:45:00+03:00 2 года, 7 месяцев назад
1
Решение
72

Проблема заключается в том, что в текущем коде переменного 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. Вам нужно, чтобы эти значения сохранялись в вызовах методов, поэтому их нужно объявлять вне области действия метода (или, как я уже сказал, вы извлекаете метод в цикл), что означает использование поля.

ответил(а) 2018-04-17T07:59:00+03:00 2 года, 7 месяцев назад
59

Вот что я считаю проблемой:
У вас есть число (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, а скорее к объекту книги. Смотрите, как это усложняет ситуацию?!

ответил(а) 2018-04-17T17:11:00+03:00 2 года, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема