私は高校の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つのより多くの時間を実行しません
私の経験から、コレクションの現在のインデックス\オブジェクトを削除することは悪い考えです。おそらく 'Node'は、必要な場合に対処する良い方法です[Node](https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html) –
ItamarG3
あなたの最後のprintは 'copy.length'を使いますが、ループは' length -1'を使います。もちろん、xは最後にインクリメントされます。だから、これは私のための論理になります(間違っているかもしれません)。基本的に 'System.out.println((x + 1)+" <"+(copy.length()-1)+" == "+(x + 1
AxelH
@ItamarGreen申し訳ありませんが、それは意味をなさない。 1つは、コレクションではなくストリングを扱うことです。この単純な文字列処理のためにいくつかのXML-DOMクラスを使う必要はありません。 – JimmyB