Вырежьте различные элементы из строки и поместите их в список - PullRequest
0 голосов
/ 24 июня 2019

Вот обновленный код. Для тех, кто следует вдоль вопроса, правка содержит оригинальный вопрос.

if (0 != searchString.length()) {
    for (int index = input.indexOf(searchString, 0); 
         index != -1; 
         index = input.indexOf(searchString, eagerMatching ? index + 1 : index + searchString.length())) {

        occurences++;
        System.out.println(occurences);

        indexIN=input.indexOf(ListStringIN, occurences - 1) + ListStringIN.length();
        System.out.println(indexIN);
        System.out.println(ListStringIN.length());

        indexOUT=input.indexOf(ListStringOUT, occurences - 1);
        System.out.println(indexOUT);

        Lresult.add(input.substring(indexIN, indexOUT));

        System.out.println();
    }
}

Как видите, я выдал номера индексов. Мой код хорошо работает только с одним элементом Но когда я пишу что-то вроде этого: %%%%ONE++++ %%%%TWO++++ Это исключение:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 16, end 7, length 23
    at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3410)
    at java.base/java.lang.String.substring(String.java:1883)
    at com.DMMS.Main.identify(Main.java:81)

И я обнаружил, что indexIN изменяется в начале второй строки, но не в indexOUT Я не мог понять, почему

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

Когда вы смотрите на свой код, вы можете заметить: в первом цикле, который подсчитывает количество вхождений, ваш код «знает», что он должен использовать ту версию indexOf(), которая опирается на смещения в строке поиска.

Другими словами: вы знаете, что вам нужно искать после предыдущих «попаданий» при прохождении через вашу строку.

Но ваш второй цикл, который должен извлечь фактические вещи, там вы используете indexOf() без этого дополнительного параметра смещения. Поэтому вы продолжаете «копировать» одну и ту же часть несколько раз.

Таким образом: «просто» применить ту же логику из цикла 1 для цикла 2!

Помимо этого:

  • вам не нужны две петли для этого. Подсчет вхождений и «копирование» соответствующего кода ... можно сделать за один цикл
  • и, честно говоря, перепишите этот первый цикл. Этот код почти непостижим для людей. Читатель должен сесть и прочитать это 10, 20 раз, а затем запустить его в отладчике, чтобы понять, что он делает
0 голосов
/ 24 июня 2019

Я это понимаю!

Вот код:

.........................
static String ListStringIN = "%%%%";
static String ListStringOUT = "++++";

........................

else if (input.contains(ListStringIN) && input.contains(ListStringOUT)) {
        System.out.println("Identifiziere Liste...");

        String searchString = ListStringIN;
        int occurences = 0;
        boolean eagerMatching = false;
        if (0 != searchString.length()) {
            for (int index = input.indexOf(searchString, 0); index != -1; index = input
                    .indexOf(searchString, eagerMatching ? index + 1 : index + searchString.length())) {



                occurences++;


                System.out.println(occurences);

                indexIN=input.indexOf(ListStringIN, occurences - 1) + ListStringIN.length();

                System.out.println(indexIN);

                //indexOUT=input.indexOf(ListStringOUT, occurences);

                //indexOUT=input.indexOf(ListStringOUT, occurences - 1);

                indexOUT = input.indexOf(ListStringOUT, eagerMatching ? index + 1 : index + ListStringOUT.length());

                System.out.println(indexOUT);
                Lresult.add(input.substring(indexIN, indexOUT));

                System.out.println();
            }
        }


        //for (int i = 0; i <occurences; i ++) {
          //  Lresult.add(input.substring(input.indexOf(ListStringIN, 0) + ListStringIN.length(), input.indexOf(ListStringOUT)));
        //}

        result = Lresult.toString();

        return result;

    }

Надеюсь, это будет полезно для других людей

@ GhostCat Спасибо за советы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...