как я хочу, чтобы мой код работал, - это когда итератор нашел строку «B», он затем перейдет к следующей строке, чтобы найти «D», который содержится в следующей строке следующим образом:
|row 2 | A | B | C |
--------------------
|row 3 | D | E | E |
но проблема, с которой я сталкиваюсь прямо сейчас, заключается в том, что строка не переходит на следующую строку. Простите меня, потому что я все еще новичок в отношении циклов в java. пожалуйста, помогите мне спасибо.
int rowStart = Math.min(15, sheet.getFirstRowNum());
int rowEnd = Math.max(1400, sheet.getLastRowNum());
// row
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row r = sheet.getRow(rowNum);
ArrayList<String> al = new ArrayList<String>();
// cell
for (int i = 0; i < r.getLastCellNum(); i++) {
Cell cell = r.getCell(i);
String stringcell = formatter.formatCellValue(cell);
al.add(stringcell);
}
ListIterator<String> lt = al.listIterator();
while(lt.hasNext()){
element = lt.next();
if (element.equals("B") {
rowNum++;
while (lt.hasNext()) {
element = lt.next();
if (element.equals("D")) {
System.out.println("found");
break;
} else {
System.out.println("false");
break;
}
}
break;
}
}
}
@dave "обновить итератор (lt)"? не могли бы вы мне объяснить?
lt - это итератор по элементам в строке Текущий. Это не изменится, если просто увеличить номер строки. Следовательно, вы никогда не найдете элемент из строки следующий.
@dave Я знаю, теперь это моя проблема. Я не знаю, как это сделать ................. помогите мне?




Общий план вашего кода может быть
String lookFor = "B";
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row r = sheet.getRow(rowNum);
boolean found = false;
// cell
for (int i = 0; i < r.getLastCellNum(); i++) {
Cell cell = r.getCell(i);
String stringcell = formatter.formatCellValue(cell);
if (stringcell .equals(lookFor)) {
rowNum++;
lookFor = "D";
found = true;
break;
}
}
if (found) {
System.out.println(lookFor + " found");
}
else {
System.out.println(lookFor + " not found");
}
}
found никогда не устанавливается на true.
Не стоит беспокоиться. Ваше решение будет соответствовать случаю, когда строки с "B" и "D" имеют промежуточные строки.
@dave Да, не совсем следуя требованиям OP, но я думаю, что этого можно избежать, если выйти, если не найден
Если я правильно понимаю, вы хотите перебирать строки электронной таблицы в поисках "B" в строке. Если вы его нашли, то вам нужно поискать "D" в следующем ряду. Что-то вроде этого может помочь.
boolean lookforD = false; foundD = false;
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row r = sheet.getRow(rowNum);
ArrayList<String> al = new ArrayList<String>();
for (int i = 0; i < r.getLastCellNum(); i++) {
Cell cell = r.getCell(i);
String stringcell = formatter.formatCellValue(cell);
al.add(stringcell);
}
ListIterator<String> lt = al.listIterator();
while (lt.hasNext()) {
element = lt.next();
if (!lookForD) {
if (element.equals("B")) {
lookForD = true;
break;
}
} else {
if (element.equals("D")) {
foundD = true;
break;
}
if (!lt.hasNext()) {
lookForD = false;
}
}
}
if (foundD) {
break;
}
}
N.B. Это довольно грубо, и я проверил это только вручную. Вам нужно убедиться, что он компилируется. Кроме того, если вы найдете "B" в одной строке, но нет "D" в следующей строке, тогда нам следует искать "B" в той же строке. Этот код не обрабатывает этот случай.
Вы увеличиваете номер своей строки (
rowNum++), но фактически не получаете следующую строку и не обновляете свой итератор (lt) перед поиском"D".