2013-07-16 2 views
-1

Я андроид для noob, и я пытаюсь заполнить arraylist внутри цикла for внутри цикла AsyncTask. Я пытаюсь взять элементы из массива строк и заполнить arraylist hashmaps. Однако я продолжаю получать исключение ArrayIndexOutofBounds. Я не мог понять, почему это происходит. Любая помощь, разрешающая это, очень ценится.Как правильно выполнить цикл for?

МОЙ КОД

JSONArray arr= new JSONArray(s); 
for(int i = 0; i < arr.length(); i++){ 
HashMap<String, String> map = new HashMap<String, String>(); 
JSONObject item=arr.getJSONObject(i); 

//Getting Comments 
String user_comments=item.getString("COMMENTS"); 
Log.e("usercomment", user_comments); //Returns "~~~1#=#2#=#3#=#4~~~1#=#2#=#3#=#4~~~1#=#2#=#3#=#4" 
String[]tokens = user_comments.split("~~~"); 
Log.e("token", tokens[0].toString());//Returns "~~~1#=#2#=#3#=#4" 
Log.e("token", tokens[1].toString());//Returns "~~~1#=#2#=#3#=#4" 
Log.e("token", tokens[2].toString());//Returns "~~~1#=#2#=#3#=#4" 
for(int k = 0; k < tokens.length; k++){ 
     String[] one_comment = tokens[k].split("#=#"); 
     map.put("Avatar", one_comment[0]);//Error thrown here. 
     Log.e("Avatar", one_comment[0].toString()); 
     map.put("Name",one_comment[1]); 
     Log.e("Name", one_comment[1].toString()); 
     map.put("Comment",one_comment[2]); 
     Log.e("Comment", one_comment[2].toString()); 
     map.put("CommentDate",one_comment[3]); 
     Log.e("CommentDate", one_comment[3].toString()); 
      comment_data.add(map); 
           } 

          } 
+6

'' ~ 1 ~ 2 ".split (" ~ ") eq new String [] {" "," 1 "," 2 "} not eq new String [] {" 1 "," 2 "}' – Selvin

+1

Петли for выглядят правильно, и ни один из счетчиков не увеличивается на один цикл больше, чем один раз, поэтому мое первоначальное предположение было бы то, что один из жестко закодированных индексов выходит за границы, а это означает, что one_comment не имеет 4 элементов или у токенов нет 3. Какая строка выбрасывает исключение индекса за пределы? – framauro13

+3

Я не верю в ваши комментарии в коде, 'tokens [0]' должно быть '' '', 'tokens [1]' is '1 # = # 2 # = # 3 # = # 4' и т. Д. afaik, разделитель не включается в разделенные значения – SpongeBobFan

ответ

0

С вашей текущей реализации, самый простой обходной путь будет инициализировать K на 1.

for(int k = 1; k < tokens.length; k++)... 

Таким образом, вы не будете пытаться запустить пустой или нулевое значение через ваш второй цикл.

0

Проблема заключается в том, как Selvin говорится выше.

"~ 1 ~ 2" .split ("~") экв новый String [] { "", "1", "2"} не эк новый String [] { "1", «2 "}

способ обойти это с помощью списка и удаление всех элементов в списке, которые являются пустыми, т.е.„“

List<String>tokens = new ArrayList(Arrays.asList(user_comments.split("~~~"))); 
    tokens.removeAll(Arrays.asList("")); 

Ваш цикл будет выглядеть следующим образом:

for(int k = 0; k < tokens.size(); k++) 
    { 
    String[] one_comment = tokens.get(k).split("#=#"); 
    map.put("Avatar", one_comment[0]); 
    Log.e("Avatar", one_comment[0].toString()); 
    map.put("Name",one_comment[1]); 
    Log.e("Name", one_comment[1].toString()); 
    map.put("Comment",one_comment[2]); 
    Log.e("Comment", one_comment[2].toString()); 
    map.put("CommentDate",one_comment[3]); 
    Log.e("CommentDate", one_comment[3].toString()); 
     comment_data.add(map); 
    } 
Смежные вопросы