如果它不存在,请创建一个新的数组索引

时间:2013-07-18 18:59:47

标签: java arrays string

说我有一个像下面的字符串

String s1 = "test1=1&test2=2&test3=&test4=4";

请注意字符串S1中的test3参数,因为它没有任何值

String [] splitS1 = s1.split("\\&");
for (int i = 0; i < splitS1.length; i++) {
    String[] params = splitS1[i].split("=");
    System.out.println("Attribute:"+params[0]+"   Value : "+params [1]);
}

上面的代码抛出了java.lang.ArrayIndexOutOfBoundsException:1,因为String s1中的test3没有任何值,因此params [1]对test3无效。

我试过这个

                if(params.length == 1) {
                    params[1] = "";
                }

但我知道我们无法扩展数组。可以在这做什么?

谢谢!

5 个答案:

答案 0 :(得分:7)

采用一个参数的split方法会丢弃尾随的空标记。在这里,这导致params只有一个长度。

使用split method that also takes a limit parameter,并传递一个否定的limit以确保您获得一个长度与实际存在的令牌数相匹配的数组:2。

String[] params = splitS1[i].split("=", -1);

然后你不必创建另一个数组;假设存在2,您将获得一个大小为=的数组。

答案 1 :(得分:2)

最简单的方法是测试数组长度:

String splitS1 = s1.split("\\&");
for (int i = 0; i < splitS1.length; i++) {
    String[] params = splitS1[i].split("=");
    System.out.println(
        "Attribute: " + params[0] +
        "   Value : " + (params.length < 1 ? "<no value>" : params[1]));
}

使用printf代替println

也可能值得
System.out.printf("Attribute: %1$s%n   Value : %2$s%n",
                  params[0],
                  params.length < 1 ? "<no value>" : params[1]
);

答案 2 :(得分:2)

创建一个表示参数的类及其名称和值,并解析字符串:

public final class Parameter {

    private final String name;
    private final String value;

    public Parameter(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public static Parameter parse(String s) {
        String[] parts = s.split("=");
        String name = parts[0];
        String value = "";
        if (parts.length > 1) {
            value = parts[1];
        }
        return new Parameter(name, value);
    }

    public String getName() {
        return name;
    }

    public String getValue() {
        return value;
    }

    // add more behavior if needed.
}

现在你可以做到

for (int i = 0; i < splitS1.length; i++) {
    Parameter param = Parameter.parse(splitS1[i]);
    System.out.println("Parameter:" + param.getName() + " = " + param.getValue());
}

答案 3 :(得分:0)

创建一个新的String数组并将split的结果复制到其中。

String[] cpy = new String[2];
for(int i=0;i<cpy.length;i++){
    cpy[i] = params[i];
}
params = cpy;

答案 4 :(得分:0)

你可以做这样的事情

String s1 = "test1=1&test2=2&test3=&test4=4";
    String[] splitS1 = s1.split("\\&");
    for (int i = 0; i < splitS1.length; i++) {
        String[] params = splitS1[i].split("=");
        String[] para=new String[2];
        if(params.length==1) {
            para[0]=params[0];
            System.out.println("Attribute:"+para[0]+"   Value : "+para [1]);

        }
        else{
            System.out.println("Attribute:"+params[0]+"   Value : "+params [1]);

        }
    }

     if(params.length==1) {
            System.out.println("Attribute:"+para[0]+"   Value : "+"");

        }
        else{
            System.out.println("Attribute:"+params[0]+"   Value : "+params [1]);

        }