2017-02-22 88 views
1

我想製作一個java程序,它將查找並刪除字符串中的重複字符。就像用戶輸入「baloon」一樣,輸出應該是「balon」。我使用String變量進行輸入,並將其內容複製到Char數組中,以便我可以分析每個字符。我得到ArrayIndexOutOfBoundsException。這裏是我的代碼如何解決此運行時錯誤?

class doubleKiller{ 

private String inputStr = " "; 
private char[] catchStr = new char[inputStr.length()]; 
private String modifiedStr; 

//Accessor method 
public void getString(String inputStr) 
{ 
    this.inputStr = inputStr; 
} 

public String killRepeater() 
{ 

    //copying string data to char array 
    this.inputStr.getChars(0 , this.inputStr.length() , catchStr , 0); 

    //------------------ 

    for(int counter = 0 ; counter < this.inputStr.length() ; counter++) 
    { 
     if(catchStr[counter] != catchStr[counter - 1]) 
     { 
      modifiedStr = modifiedStr + catchStr[counter]; 
     } 
    } 

    return modifiedStr; 
} 

}

這裏是輸出時killRepeater()被調用。

java.lang.ArrayIndexOutOfBoundsException: src.length=5 srcPos=0 dst.length=1 dstPos=0 length=4 

at java.lang.System.arraycopy(Native Method) 
at java.lang.String.getChars(String.java:894) 
at doubleKiller.killRepeater(Main.java:23) 
    at useThings.main(Main.java:49) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.aide.ui.build.java.RunJavaActivity$1.run(SourceFile:108) 
at java.lang.Thread.run(Thread.java:862) 

告訴我,我的錯誤...提前

+4

在循環的第一次迭代中,counter是零,所以'catchStr [counter-1]'試圖獲取索引爲'-1'的元素。 –

+0

除了Joe Clay所說的之外,你可能需要修改你的條件以說明你的循環何時開始,這樣你就不會出界。 – Chad

回答

2

謝謝,你是做

private String inputStr = " "; 
private char[] catchStr = new char[inputStr.length()]; 

inputStr.length()回報1,即從字符串 「」 大小,因此,你有一個字符數組,大小爲1

當你這樣做:

for(int counter = 0 ; counter < this.inputStr.length() ; counter++){ 
    if(catchStr[counter] != catchStr[counter - 1]){ 

隨着inputStr.length() > 1你有一個ArrayIndexOutOfBoundsException

此外,運行catchStr[counter - 1])首次時候,counter-1會產生-1這不是一個有效的索引。嘗試從1運行counter以避免此錯誤。

固定大小(例如200)或使用ArrayList聲明您的陣列。在輸入字符串之後,您還可以輸入

0

您正在使用inputStr.length()初始化catchStr。但在這個時候inputStr =「」。所以catchStr的長度爲1.當你稍後將inputStr填充到一個更大的值時,你嘗試將它複製到長度爲1的char []中,並且它不適合。在複製之前添加catchStr = new char[inputStr.length()];

1

,你問的具體問題,但如果你有興趣如何使這個簡單的好東西,有正則表達式魔術

String in = "ballooooon"; 
String out = in.replaceAll("(.)\\1+", "$1"); // balon 

這意味着

發現任何符號,將其保存到組1,如果下一個符號或符號等於組1,則刪除它們,並從組中只留下一個符號。

0

當你初始化catchStr它總會有1的值,因爲inputStr" ",因此它的長度是1

private String inputStr = " "; 
private char[] catchStr = new char[inputStr.length()]; 

當環路上counter的方法killRepeater()你會得到一個ArrayOutOfBoundsException,因爲您在getString中傳遞的字符串可能大於1。


考慮將new char[inputStr.length()]getString

public void getString(String inputStr) { 
    this.inputStr = inputStr; 
    this.catchStr = new char[inputStr.length()]; 
} 

而且,將屬性catchStr設置爲未初始化。

private char[] catchStr; 

第二個問題是你for循環。您從0開始counter並使用catchStr[counter - 1]回顧前一個字符。這在counter = 0因爲索引將評估爲-1而不起作用。

考慮從1開始你的counter,並繼續從那裏開始工作。你需要稍微調整一下,以便輸出所需的字符串。

for (int counter = 1; counter < this.inputStr.length(); counter++) { 
    if (catchStr[counter] != catchStr[counter - 1]) { 
     modifiedStr = modifiedStr + catchStr[counter]; 
    } 
}