Увеличение строки на 1 в arraylist java

как я хочу, чтобы мой код работал, - это когда итератор нашел строку «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;
                    }
         }
}

Вы увеличиваете номер своей строки (rowNum++), но фактически не получаете следующую строку и не обновляете свой итератор (lt) перед поиском "D".

dave 25.10.2018 02:39

@dave "обновить итератор (lt)"? не могли бы вы мне объяснить?

sharky 25.10.2018 02:49
lt - это итератор по элементам в строке Текущий. Это не изменится, если просто увеличить номер строки. Следовательно, вы никогда не найдете элемент из строки следующий.
dave 25.10.2018 02:51

@dave Я знаю, теперь это моя проблема. Я не знаю, как это сделать ................. помогите мне?

sharky 25.10.2018 03:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Общий план вашего кода может быть

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.
dave 25.10.2018 04:39

Не стоит беспокоиться. Ваше решение будет соответствовать случаю, когда строки с "B" и "D" имеют промежуточные строки.

dave 25.10.2018 04:43

@dave Да, не совсем следуя требованиям OP, но я думаю, что этого можно избежать, если выйти, если не найден

Scary Wombat 25.10.2018 04:45

Если я правильно понимаю, вы хотите перебирать строки электронной таблицы в поисках "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" в той же строке. Этот код не обрабатывает этот случай.

Другие вопросы по теме