2017-02-22 16 views
1

文字列の繰り返し文字を見つけて削除するJavaプログラムを作成しようとしています。ユーザーが「baloon」と入力した場合と同様に、出力は「balon」でなければなりません。私は入力のための文字列変数を使用し、その文字の内容を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を行っている...私は私のエラーを知らせる、それは "文字列" からサイズですので、文字サイズがchar配列があります。

あなたは:あなたはArrayIndexOutOfBoundsExceptionを持ってinputStr.length() > 1

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

。初めて実行catchStr[counter - 1])counter-1が有効なインデックスされていない-1を生成する。また

、。このエラーを回避するには、counter1から実行してください。

固定サイズ(たとえば200)の配列を宣言するか、ArrayListを使用してください。文字列の入力後に を入力することもできます。

0

catchStrをinputStr.length()で初期化しています。しかし、この時点では、inputStr = ""です。だから、catchStrの長さは1です。後ほどinputStrをより大きな値に設定すると、長さ1のchar []にコピーしようとすると、フィットしません。コピーを行う直前にcatchStr = new char[inputStr.length()];を追加してください。

1

あなたは、特定の問題について尋ねて良いことは、これは簡単にするために、どのように興味を持った場合には、正規表現の魔法に保存し、任意のシンボルを見つける

を意味

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

がありますグループ1、次のシンボルがグループ1と等しい場合は、それらを削除してグループから1つだけを残します。

0

あなたがcatchStrを初期化するときinputStr" "であるため、それは長さだから、それは常に、1の値を持つことになりますが1

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

あなたが得るkillRepeater()方法でcounterにあなたがループでありますArrayOutOfBoundsExceptiongetStringに渡す文字列がおそらく1より大きいためです。


getStringnew char[inputStr.length()]を移動することを検討してください。

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

また、属性catchStrを未初期化に設定します。

private char[] catchStr; 

第二の問題は、あなたのforループです。 counterは0で開始し、catchStr[counter - 1]を使用して前の文字を振り返ります。インデックスが-1と評価されるため、counter = 0の場合は機能しません。

counterを1で開始することを検討し、そこからメソッドを続行します。必要な文字列を出力するには少し微調整する必要があります。

for (int counter = 1; counter < this.inputStr.length(); counter++) { 
    if (catchStr[counter] != catchStr[counter - 1]) { 
     modifiedStr = modifiedStr + catchStr[counter]; 
    } 
} 
関連する問題