Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从字符串中剪切出不同的元素并将它们放入列表中_Java - Fatal编程技术网

Java 从字符串中剪切出不同的元素并将它们放入列表中

Java 从字符串中剪切出不同的元素并将它们放入列表中,java,Java,这是最新的代码。对于以下问题,编辑包含原始问题 if(0!=searchString.length()){ for(int index=input.indexOf(searchString,0); 索引!=-1; index=input.indexOf(searchString,index+1:index+searchString.length()){ 事件++; 系统输出打印项次(发生次数); indexIN=input.indexOf(ListStringIN,occurrences-1)+

这是最新的代码。对于以下问题,编辑包含原始问题

if(0!=searchString.length()){
for(int index=input.indexOf(searchString,0);
索引!=-1;
index=input.indexOf(searchString,index+1:index+searchString.length()){
事件++;
系统输出打印项次(发生次数);
indexIN=input.indexOf(ListStringIN,occurrences-1)+ListStringIN.length();
System.out.println(indexIN);
System.out.println(ListStringIN.length());
indexOUT=input.indexOf(ListStringOUT,occurrences-1);
System.out.println(indexOUT);
添加(input.substring(indexIN,indexOUT));
System.out.println();
}
}
如你所见,我给出了索引编号 我的代码只在一个元素上运行良好 但是当我写这样的东西时:
%%%ONE++++++%%%%%TWO++
有一个例外:

线程“main”java.lang.StringIndexOutOfBoundsException中的异常:开始16,结束7,长度23 位于java.base/java.lang.String.checkBoundsBeginEnd(String.java:3410) 位于java.base/java.lang.String.substring(String.java:1883) 位于com.DMMS.Main.identify(Main.java:81) 我发现indexIN在第二个字符串的开头发生了变化,但indexOUT没有变化
当您查看代码时,我无法找到原因:在计算出现次数的第一个循环中,您的代码“知道”它必须使用依赖于搜索字符串中的偏移量的
indexOf()

换言之:你知道在浏览你的字符串时,你必须在之前的“点击”之后搜索

但是您的第二个循环,必须提取实际内容的循环,在这里您使用的是
indexOf()
,而不使用额外的偏移参数。因此,您不断重复“复制”同一部分

因此,“简单地”将相同的逻辑从循环1应用到循环2

除此之外:

  • 你不需要两个循环。计算发生次数并“复制”匹配代码。。。可以在一个循环中完成
  • 老实说:重写第一个循环。人类几乎无法理解这种代码。读者必须坐下来读10到20遍,然后在调试器中运行它以了解它在做什么
    • 我编辑它

      代码如下:

      .........................
      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;
      
          }
      
      。。。。。。。。。。。。。。。。。。。。。。。。。
      静态字符串ListStringIN=“%%%””;
      静态字符串ListStringOUT=“+++++”;
      ........................
      else if(input.contains(ListStringIN)和&input.contains(ListStringOUT)){
      System.out.println(“Identifiziere-Liste…”);
      String searchString=ListStringIN;
      int发生率=0;
      布尔匹配=假;
      如果(0!=searchString.length()){
      for(int index=input.indexOf(searchString,0);index!=-1;index=input
      .indexOf(searchString,索引+1:index+searchString.length()){
      事件++;
      系统输出打印项次(发生次数);
      indexIN=input.indexOf(ListStringIN,occurrences-1)+ListStringIN.length();
      System.out.println(indexIN);
      //indexOUT=input.indexOf(ListStringOUT,occurrences);
      //indexOUT=input.indexOf(ListStringOUT,occurrences-1);
      indexOUT=input.indexOf(ListStringOUT,索引+1:index+ListStringOUT.length());
      System.out.println(indexOUT);
      添加(input.substring(indexIN,indexOUT));
      System.out.println();
      }
      }
      
      //为了(int i=0;i)你的问题不清楚。请注意:我不是在指责你什么。只是说依赖你不懂的代码是危险的。当你从“所有人”下面编辑问题时,没有任何意义了。你可以在问题中添加代码,但现在答案线程是对不再理解的问题的响应存在。问题也不是评论线索。@DaveNewton你能把它还原到原来的帖子吗?@Bentaye任何拥有编辑权限的人都可以;我在手机上,不想试图编辑原来的和当前的问题。我必须承认我复制了代码,我不知道它到底是如何工作的,你能帮我一点忙吗?@TristanK。所以rry,但是这个社区不是一个辅导服务,人们坐下来和你一起解决你的问题。这是一个问题:当你从某个地方挑选代码,但你想在你的项目中使用它时……你更好地理解它在做什么。我给你的建议是:扔掉那些代码。相反,写你自己的代码。开始这是一个更简单的“语法”,其中有简单的字符标记开始/结束。然后写一个包含2,3个“出现次数”的字符串想想你将如何手动确定它们…并删掉相应的文本。这真的没有那么难,当你自己编写代码来解决问题时,你会学到更多。最后,这是你的代码。你必须理解它,并能够维护它。这基本上意味着:你永远不会引入如此复杂的代码我想为自己辩护你是对的,但子字符串是第一件事,我只是复制,它是我一个更大项目的一部分,我想我还不知道我到底在做什么,我只需要它,请不要认为我是复制粘贴GUY@TristanK.如前所述,我给了你一个冗长的提示如何处理这个问题。扔掉它代码,并逐步编写小测试…以及使测试通过的代码。这确实是一个学习如何使用TDD和junit的好机会。不,如果不解释代码的作用以及如何解决问题,这对其他人来说是没有用的。我还建议删除未使用的代码和spur