Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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_Arrays_String_For Loop - Fatal编程技术网

Java-子字符串存储到单独的字符串变量中

Java-子字符串存储到单独的字符串变量中,java,arrays,string,for-loop,Java,Arrays,String,For Loop,所以我有一个如下的字符串 "1: Command(1, 2, 3)" 我最终希望将1233存储到String变量中。我怎样才能做到这一点 下面是一段代码,用于读取字符串数组并尝试打印该字符串的参数 for (int i = 0; i < TableElements.length; i++) { if (sadTableElements[i] != null) { System.out.println("DEBUG " + sadTableElements[i]); P

所以我有一个如下的字符串

"1: Command(1, 2, 3)"
我最终希望将1233存储到
String
变量中。我怎样才能做到这一点

下面是一段代码,用于读取字符串数组并尝试打印该字符串的参数

for (int i = 0; i < TableElements.length; i++) {
  if (sadTableElements[i] != null) {
    System.out.println("DEBUG " + sadTableElements[i]);
    Param0 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf("(") + 1, 
                              TableElements[i].indexOf(",")));
    System.out.println(Param0);

    Param1 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf(",") + 2, 
                              TableElements[i].indexOf(",")));
    System.out.println(Param1);

    Param2 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf(",") + 2, 
                              TableElements[i].indexOf(")")));
    System.out.println(Param2);
  }
}
for(int i=0;i
我得到这个输出:

调试1:线程“AWT-EventQueue-0”中的命令(1、2、3)1异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围: -二,

它似乎在
System.out.println(Param1)处停止


TableElements[i].indexOf(“,”
为您提供第一个
字符的索引,该索引低于从
TableElements[i].indexOf(“,”)+2
获得的索引。这就是为什么会出现异常。

最好使用regexp:

java.util.regex.Matcher m = java.util.regex.Pattern.compile("^\\d+: Command\\((\\d+), (\\d+), (\\d+)\\)").matcher("1: Command(1, 2, 3)");
if (!m.matches()) {
    throw new AssertionError("Your Regex Pattern or Input is bad");
}
System.out.println(m.group(1) + " | " + m.group(2) + " | " + m.group(3));
这里的输出是:
1 | 2 | 3

注意:如果您对其进行了调整,请重新使用已编译的模式,不要对每个输入字符串重新编译

 Param1 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf(",") + 2, TableElements[i].indexOf(",")));
两个indexOf(…)表示完全相同的冒号。因此,您正在构建一个从索引+2到索引的子字符串。您可以使用split(…)函数,也可以将创建的子字符串保存在新字符串中。

indexOf()函数在Java中返回匹配子字符串的第一个索引,因此 indexOf(“,”)将始终返回它在整个输入字符串中找到的第一个“,”的索引

i、 e.indexOf(“,”)将始终返回输入字符串中找到的第一个“,”的索引。要获取Param1和Param2,请尝试使用以下代码:

    Param0 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf("(") + 1, TableElements[i].indexOf(",")));
    System.out.println(Param0);
    Param1 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf(",") + 2, TableElements[i].lastIndexOf(",")));
    System.out.println(Param1);
    Param2 = Integer.parseInt(TableElements[i].substring(TableElements[i].lastIndexOf(",") + 2, TableElements[i].indexOf(")")));
    System.out.println(Param2);
函数的作用是:返回可能匹配项的最后一个索引,即返回第二个匹配项的索引,该索引应给出正确的输出


希望有帮助

手动计算应该由
indexOf
返回的数字-将它们放入代码中,然后您将看到错误
    Param0 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf("(") + 1, TableElements[i].indexOf(",")));
    System.out.println(Param0);
    Param1 = Integer.parseInt(TableElements[i].substring(TableElements[i].indexOf(",") + 2, TableElements[i].lastIndexOf(",")));
    System.out.println(Param1);
    Param2 = Integer.parseInt(TableElements[i].substring(TableElements[i].lastIndexOf(",") + 2, TableElements[i].indexOf(")")));
    System.out.println(Param2);