2014-01-27 28 views
0

Я сделал способ, который должен очистить String. Он должен удалить каждый символ с досягаемостью [a,z].StringIndexOutOfBoundsException

Но я получаю это исключение: StringIndexOutOfBoundsException. В тот момент, когда я вставляю номер в недоступные для него условия, это исключение появляется. Я не могу понять, что я сделал неправильно.

public static String kuisStringOp(String str){ 
     StringBuilder strb = new StringBuilder(str); 

     for (int i = 0; i < str.length(); i++) { 
      if(strb.charAt(i)<'a'||strb.charAt(i)>'z'){ 

       strb.deleteCharAt(i); 


      } 

     }   
     return strb.toString(); 
    } 
+0

str.length() -1 –

ответ

4

Вы работаете по всей длине исходной строки, но вы удалить некоторые символы в StringBuilder. Как только вы удалили символ, ваш StringBuilder короче, чем ваш оригинал String, и содержимое переместилось, чтобы закрыть удаленный символ. В конце концов вы закончите конец StringBuilder, прежде чем вы достигнете конца своего оригинала String.

Измените условие цикла for, чтобы проверить длину вашего StringBuilder, и если вы удалите символ, на его месте появится другой символ. Проверьте это снова декремента i:

for (int i = 0; i < strb.length(); i++) { 
    if(strb.charAt(i)<'a'||strb.charAt(i)>'z'){ 
     strb.deleteCharAt(i); 
     i--; 
    } 

}  
1

Если вы к перебрать str но удалить из strb, вам нужно
держать два индекса/указатели, один на str и один в strb.

Попробуйте это.

public class Test015 { 
    public static void main(String a[]) throws Exception { 
     String z = "111aaaa2222bbb"; 
     System.out.println(kuisStringOp(z)); 
    } 

    public static String kuisStringOp(String str){ 
     StringBuilder strb = new StringBuilder(str); 
     int i = 0; 
     int j = 0; 

     for (i = 0; i < str.length(); i++) { 
      if(strb.charAt(j)<'a'||strb.charAt(j)>'z'){ 
       strb.deleteCharAt(j); 
      }else{ 
       j++; 
      } 
     }   
     return strb.toString(); 
    } 

} 
1

Использование

for (int i = 0; i < strb.length(); i++) { 

насколько вы удаления символов в буфере, Вы должны проверить его длину до следующей итерации.

0

Вы меняете строку и в то же время вы итерацию над ним ....

Regex.Replace сделает более чистое решение, как это:

Regex.Replace(input, "[a-z]", ""); 
Смежные вопросы