复制分割为另一个字符串的字符串

时间:2014-04-22 22:15:16

标签: java string syntax

在类的某个地方我已经声明了一个时间字符串变量

String name;

我将用于存储文字数据。该文本包含许多具有这两种格式的字段

Type: text/html

name=foo

对于这种情况,我对类型字段 name=foo

特别感兴趣

所以,我先前使用split

突破了文字的行
String lines[] = text.split("\n"); 

而且,我将再次使用split来识别所提及类型的字段。在下面的代码中,while循环在检测到name=foo字段的位置停止,并在控制台中打印该字段的值。

int i = 0;  // Counter for the while cycle

while (!(lines[i].split("=")[0].equals("name"))) {
    i++;                      

    if (lines[i].split("=")[0].equals("name")) // If the field is name...
    System.out.println(lines[i].split("=")[1]); // Prints the value of the field

    name = lines[i].split("=")[1]; // <-- My problem is here
}

当我想将字段的值复制到早期提到的String变量时,我的问题开始了,给我一个 java.lang.ArrayIndexOutOfBoundsException

我需要String稍后再做一些事情。是否安全地将该字段的值复制到String变量

4 个答案:

答案 0 :(得分:1)

为你的问题添加paranthesis可以避免两个问题:

  • 如果一行包含no =整个String在[0]中并且访问[1]将导致所述异常
  • 无论条件如何,您都在更改(覆盖)变量名称

为了取悦编译器,您可能还希望将名称初始化为null

int i = 0;  // Counter for the while cycle

while (!(lines[i].split("=")[0].equals("name"))) {
    i++;                      

    if (lines[i].split("=")[0].equals("name")){ // If the field is name...
        System.out.println(lines[i].split("=")[1]); // Prints the value of the field

        name = lines[i].split("=")[1]; // <-- My problem is here
    }
}

答案 1 :(得分:1)

在您的代码中:

String name;
name = lines[i].split("=")[1];

这里的名字每次都会覆盖。

我认为你正在寻找这样的东西:

String names[];

String lines[] = text.split("\n");
names[] = new String[lines.length];

在你内心循环时,它就像:

names[i] = lines[i].split("=")[1];

答案 2 :(得分:1)

您的代码有很多注意事项:

  • 您可能会在{} - 语句之后错过if,因此每次运行while时都会更新名称 - 循环
  • 您无需检查[1]产生了多少元素
  • 即可访问split("=")
  • 你几乎在每一行都打了split("=")次4次。通过引入临时变量来节省CPU时间!
  • 您可以将while - 循环替换为for循环,该循环也会在第一行中找到name=value而不会#34;抛出&#34;如果name=value不在任何行内(您不检查i是否小于lines.length

我把你的评论留在了我的答案中;随意删除它们。

变体a(使用索引):

for (int i = 0; i < lines.length; i++) {
    // Only split once and keep X=Y together in name=X=Y by specifying , 2
    final String[] split = lines[i].split("=", 2);

    if (split.length == 2 && split[0].equals("name")){ // If the field is name...
        System.out.println(split[1]); // Prints the value of the field

        name = split[1]; // <-- My problem is here
        break; // no need to look any further
    }
}

变体b(使用&#34; for-each&#34;):

for (String line : lines) {
    // Only split once and keep X=Y together in name=X=Y by specifying , 2
    final String[] split = line.split("=", 2);

    if (split.length == 2 && split[0].equals("name")) { // If the field is name...
        System.out.println(split[1]); // Prints the value of the field

        name = split[1]; // <-- My problem is here
        break; // no need to look any further
    }
}

答案 3 :(得分:0)

我想你的问题是当你到达最后一行或不包含“=”符号的行。你正在检查

!(lines[i].split("=")[0].equals("name"))

然后你加1给我,所以这个条件现在可能是假的

if (lines[i].split("=")[0].equals("name"))

你将在这里得到java.lang.ArrayIndexOutOfBoundsException

name = lines[i].split("=")[1];

如果该行不包含“=”。

尝试

if (lines[i].split("=")[0].equals("name")) { // If the field is name...
    System.out.println(lines[i].split("=")[1]); // Prints the value of the field

    name = lines[i].split("=")[1];
}