2017-03-04 14 views
1

私はクラスのためのプロジェクトを進めており、文字列を操作するのにcharAt()、length()、substring()、およびequals() 。ループは文字列の文字列をすべて文字列から削除しません

文字のすべてのインスタンスを文字列から削除するビットに固執しています。文字列が連続する同一の文字を持つ場合、プログラムは毎回1つの文字を残します。例は「午後」です。 'n'を削除したい場合、プログラムはnを正しく削除し、出力は "afteroo"です。しかし、「o」を削除したい場合、出力は「afternon」です。

これは私がプログラムのこの部分のために持っているものです。

System.out.println("Enter the character to remove."); 
removeChar = keyboard.nextLine(); 

char remove = removeChar.charAt(0), 
    original; 

for(i=0; i < input.length(); i++){ 
    original = sentence.charAt(i); 
    if(original == remove) 
     sentence = sentence.substring(0,i) + sentence.substring(i+1); 
} 
System.out.println(sentence); 
+0

あなたは基本的に "午後"があり、 "o"を削除したい場合は "afternn"にする必要がありますか? –

+0

あなたは 'input'をループするのに' i'を使いますが、 'sentence'もそれを操作しています。 'sentence'から文字を削除すると、' i'は 'sentence'をスプライスする有効な方法ではなくなりました。 – Jeremy

答えて

2

あなたが行の権利を削除するには、文字のうちの2つを持っている場合は、forループ内の文字列から文字を削除しているので、もう1つは見逃してしまいます。これは、最初のものを削除すると、2番目のものが最初のもののインデックスに移動してから、iが増えてしまうためです。この問題を解決するには、文字を削除するときにiを増やしたり、削除したい文字のインデックスを格納したりして、同じ問題を再び回避するために文字列の後ろから前面に一度にすべて削除してください。文字を削除するときにiを増やしたくない場合は、whileループがうまく機能します。

2

あなたはUnknowableIneffibleの提案を行うことができますか、次のようにあなたがiを更新することができます。

if(original == remove){ 
    sentence = sentence.substring(0,i) + sentence.substring(i+1); 
    i--; 
} 
1

UnknowableIneffibleの答えは、良い点を作る、whileループは、この場合に容易になるだろう。それはあなたの「後ろ」にのみ起こるように、あなたは、シフト文字に影響されない、この方法を

for (int i = input.length() - 1; i >= 0; i--) 

:あなたはまた、ループのためにあなたに固執するが、逆方向にそれを介して行くことができます。

これは、コレクションからアイテムを削除するためにインデックス付きループを使用する場合にもうまく機能します。アドバンスドループがConcurrentModificationExceptionを投げると、リードをカウントすると要素がなくなり、IndexOutOfBoundsExceptionが発生しますが、カウントダウンするとそのトリックが実行されます。

関連する問題