2013-07-18 37 views
1

说我有类似下面创建一个新的数组索引,如果不存在

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,因为字符串s1中的test3没有任何值,因此params [1]对于test3无效。

我试着这样做

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

但我知道,我们不能扩展阵列。这里可以做些什么?

谢谢!

回答

7

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

用户的split method that also takes a limit parameter,并传递一个负limit以确保获得的阵列与该令牌的实际存在的号码相匹配的长度:2

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

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

+1

+1这是要走的路。 :) –

+1

优雅!不知道极限参数。 – vijay

+0

完美的工作!谢谢! –

0

创建一个新的字符串数组并将分割的结果复制到它。

String[] cpy = new String[2]; 
for(int i=0;i<cpy.length;i++){ 
    cpy[i] = params[i]; 
} 
params = cpy; 
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

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

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()); 
} 
+0

完美,好工作。这是我会采取的方法。 –

+0

这也是一个很好的。我喜欢这种方法。整齐! –

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]); 

     } 
相关问题