从字符串中切出不同的元素并将其放入列表中

时间:2019-06-24 13:12:57

标签: java

这里是更新的代码。对于后续问题,这些内容包含原始问题。

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)

我发现第二个String的开始处的indexIN发生了变化,但indexOUT却没有变化 我不知道为什么

2 个答案:

答案 0 :(得分:2)

当您查看代码时,您会注意到:在计算发生次数的第一个循环中,您的代码“知道”它必须使用依赖于偏移量的indexOf()版本/ strong>。

换句话说:您知道在遍历字符串时必须搜索之后前一个“匹配”。

但是您的第二个循环(必须提取一个实际的东西)在那里,您正在使用indexOf() 而没有该额外的偏移量参数。因此,您将反复重复“复制”相同的部分。

因此:“简单地”将循环1的逻辑应用于循环2!

除此之外:

  • 您不需要两个循环。计数事件并“复制”出匹配的代码...可以一次循环完成
  • 老实说:重写第一个循环。该代码对于人类几乎是难以理解的。读者将不得不坐下来阅读10到20次,然后在调试器中运行它以了解其作用

答案 1 :(得分:-1)

我把它弄干净了!

此处提供代码:

.........................
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感谢您的建议!