2016-11-04 3 views
0

私は高校のCSクラスのために書いたこのプログラムを持っています。最初は、それに問題はなく、(私の隣の子供とは違って)良いサイズにチャンクすることができて満足していました。最近、私はコードに問題があるはずであることに気付きました。背景情報を教えてください。無効な部分文字列チェックの前にループが終了するのはなぜですか?

クラスは、文字列を実行して、重複する隣接する文字をすべて削除して、そのうちの1つだけが残るようにします。だからeeeeはeになり、eeelsはeelsになります。

私のアプローチは、各インデックス(最後を除く)を実行し、重複が見つかった場合は、現在のインデックスを削除することでした。隣接する3文字以上の文字を処理するには、forループの変数を-1に戻して、インデックス0から始まり、別のペアを探します。

文字列が単純に同じ文字である場合は、文字が1文字に絞られても、文字列とそれを確認しようとしているはずです文字を入力すると、エラーが発生します。

これはおそらく意味をなさないため、私は私の要点を説明するためにいくつかの印刷ステートメントをコードに入れています。文字列はstrインスタンス変数に保持されていますが、問題は同じままにする必要があるので、コピーを作成しました。

これは私がこの方法で使用されるコードです:

public String removeDups(){ 
    String copy = str; 
    for(int x = 0; x < copy.length()-1; x++){ 
     System.out.println("Checking -> " + copy); 
     if(copy.substring(x, x+1).equals(copy.substring(x+1, x+2))){ 
      copy = copy.substring(0, x) + copy.substring(x+1); 
      //Restarts the search to make sure three characters in a row are adressed correctly 
      x = -1; 
     } 
     System.out.println("New Copy -> " + copy); 
     System.out.println(x + " < " + copy.length() + " == " + (x < copy.length()-1)); 
    } 
    return copy; 
} 

、これが問題の私のテストケースだった私は、これは

Checking -> eee 
New Copy -> ee 
-1 < 2 == true 
Checking -> ee 
New Copy -> e 
-1 < 1 == true //This is true, so it should loop again. 
e //This is the weird thing, loop is broken. 
eee 
を出力するものである

ProblemX p5 = new ProblemX("eee"); 
s = p5.removeDups(); 
System.out.println(s); 
s = p5.toString(); 
System.out.println(s); 

を検出

私はコメントをマークしたところで、もう一度ループが実行されているはずです(条件が真であった)。これは、コードwo uldはインデックス2の部分文字列を取ることができなかったために壊れていましたが、コードがそこから抜け出し、メインメソッドに完全に戻りました。

これは明らかに機能しますが、私はexplinationを望みます。ありがとう。

EDIT:問題が発生した場合、if文に条件(copy.length()> = 2)を入れて、文字列が小さすぎると何も起こらないことを確認し、最終的に壊れる。あなたのループが1つのより多くの時間を実行しません

+0

私の経験から、コレクションの現在のインデックス\オブジェクトを削除することは悪い考えです。おそらく 'Node 'は、必要な場合に対処する良い方法です[Node](https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html) – ItamarG3

+3

あなたの最後のprintは 'copy.length'を使いますが、ループは' length -1'を使います。もちろん、xは最後にインクリメントされます。だから、これは私のための論理になります(間違っているかもしれません)。基本的に 'System.out.println((x + 1)+" <"+(copy.length()-1)+" == "+(x + 1 AxelH

+0

@ItamarGreen申し訳ありませんが、それは意味をなさない。 1つは、コレクションではなくストリングを扱うことです。この単純な文字列処理のためにいくつかのXML-DOMクラスを使う必要はありません。 – JimmyB

答えて

2

理由は、あなたのforループで使用される条件にある:

通常
x < copy.length()-1 

、項目のリストを反復処理するとき、あなたが使用します。

x < copy.length() 

または

x <= copy.length() - 1 

しかし、あなたのループは、両方を使用しています(<=に対して)およびcopy.length() - 1(ちょうどcopy.length()とは対照的に)。結果として、xが0であり、copyeである場合、ループ条件は0 < 0であり、これはfalseと評価されます。

xループは、ループの終わりにあなたのチェックがtrueを返す理由である、終わった後にをインクリメントしていることを心に留めておくことは重要であるが、次のループの条件はfalseを返します。

関連する問題