簡體   English   中英

StringIndexOutOfBoundsException

[英]StringIndexOutOfBoundsException

我做了一個應該清理String 它必須刪除[a,z]范圍內的每個字符。

但是我得到了這個異常: 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(); 
    }

您正在遍歷原始字符串的整個長度,但是正在刪除StringBuilder某些字符。 刪除字符后, StringBuilder會比原始String短,並且內容已轉移為覆蓋已刪除的字符。 在到達原始String的末尾之前,您最終將在StringBuilder的末尾運行。

更改for循環條件以檢查StringBuilder的長度,如果刪除一個字符,則現在替換另一個字符。 遞減i再次檢查:

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

}       

如果要遍歷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(); 
    }

}

采用

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

至於刪除緩沖區中的字符,則需要在下一次迭代之前檢查其長度。

您正在更改字符串,同時正在對其進行迭代.....

Regex.Replace將提供更清潔的解決方案,例如:

Regex.Replace(input, "[a-z]", "");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM