新しい文字列のすべての出現箇所が変更されます。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();
}
}
あなたの方法の一部だけです。問題は、オブジェクトと参照の仕組みに関する簡単な誤解であると思われますので、残りの部分をお見せください。 – DarkDust
コードはコンパイルされていますか?あなたは 'i ++'や 'i = i + 1'を見逃しましたか? –
@ShreeKrishna:彼はそれを見逃さなかった、それは 'if'ステートメントの中にある。しかし、キャラクターが処理されなければ、彼は無限ループを繰り返すでしょう。 – DarkDust