2016-05-29 24 views
1

私はプログラム内の特定の文字を他の文字に置き換えるプログラムを用意しています。しかし、私はこのプログラムを実行すると、変更された文字を元に戻し続けているようです。これは、これまでのコードです:文字列内の複数の文字を変更する

public static String changeSample(String sample) { 

    for (int i = 0; i < sample.length(); i++) { 

     if (sample.charAt(i) == 'A') { 

      sample = sample.replace(sample.charAt(i), 'B'); 
      continue; 

     } 

     else if (sample.charAt(i) == 'B') { 

      sample = sample.replace(sample.charAt(i), 'A'); 
      continue; 

     } 

    } 

    return sample; 

は、私は、文字列内の各文字を反復処理し、それはどちらかのA、B、C、D、Eであるかどうかを確認することができる方法、またはFと変更があります

+0

あなたの方法の一部だけです。問題は、オブジェクトと参照の仕組みに関する簡単な誤解であると思われますので、残りの部分をお見せください。 – DarkDust

+0

コードはコンパイルされていますか?あなたは 'i ++'や 'i = i + 1'を見逃しましたか? –

+1

@ShreeKrishna:彼はそれを見逃さなかった、それは 'if'ステートメントの中にある。しかし、キャラクターが処理されなければ、彼は無限ループを繰り返すでしょう。 – DarkDust

答えて

4

新しい文字列のすべての出現箇所が変更されます。String特定の位置にあるキャラクターだけではありません。だからあなたの問題は、繰り返されたreplace()ステートメントが効果的に値を前後に変更しているということです。

Stringは不変なので、単にその文字を他の文字と動的に置き換えることはできません。したがって、代わりにStringBuilderを使用するようにコードを変換してください。

StringBuilder buildSample = new StringBuilder(); 
buildSample.append(sample); 

今、あなたは、一度に1つの位置の文字を変更するsetCharAt()の代わりreplace()を使用することができます。

buildSample.setCharAt(i, 'A'); 

最後に、buildSample.toString()を返すことができます。

各文字A〜Fをその補数に変更する場合、これらの6文字のみが必要な場合は、switch文のハードコーディングされた関数を使用します。さもなければ、文字のASCII値をチェックした後に補数を返す、complementaryLetter()のような関数を使うことができます。これはすべての文字に対して機能します。非文字入力の場合、無効なケースを処理するためのコードを追加できます。

完全な作業コード:

public class Replace { 
    public static void main(String[] args) { 
     String s1 = "ABCDEFA"; 
     System.out.println(s1); 
     s1 = changeSample(s1); 
     System.out.println(s1); 
    } 

    public static char complementaryLetter(char letter) { 
     char retChar = 'A'; 
     if ((int) letter % 2 == 0) 
      retChar = (char) ((int)letter - 1); 
     else 
      retChar = (char) ((int) letter + 1); 
     return retChar; 
    } 

    public static String changeSample(String sample) { 
     StringBuilder buildSample = new StringBuilder(); 
     buildSample.append(sample); 
     for (int i = 0; i < sample.length(); i++) { 
      buildSample.setCharAt(i, complementaryLetter(sample.charAt(i))); 
     } 
     return buildSample.toString(); 
    } 
} 
+0

あなたの答えは正しいが、私はあなたの説明の正しさを疑う。あなたは言った**文字列は不変なので、一度に1文字ずつ置き換えることはできません**、もう少し説明していただけますか?私が知っているように、不変の文字列は変更できませんし、単一の文字が変更されているか複数であるかは本当に気にしません。 – SacJn

+0

はい、文字列はまったく変更できません。私はキャラクターを変えるという彼の要求に、より具体的な対応をしていました。 – Kajal

+0

あいまいさを解消するために私の答えを編集しました。ありがとうございました。 – Kajal

関連する問題