2013-07-18 3 views
1

Скажем, у меня есть строка, как показано нижеСоздать новый индекс массива, если он не существует

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

Pls отметить параметр TEST3 в строке S1, поскольку это не имеет никакого значения

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

Выше кода throws java.lang.ArrayIndexOutOfBoundsException: 1, поскольку test3 в String s1 не имеет никакого значения, поэтому параметры [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 и скопируйте результат разбиения на него.

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

     } 
Смежные вопросы