###質問
表題の通り、任意の文字列中の、アルファベットAをBに、BをAに置換したいです。
Stringクラスの、replaceAllメソッドを使えば、AをBに置換することはできますが、
その後もう一度replaceAllメソッドで、BをAに置換しようとすると、先ほどAをBに置換したところまでAになってしまいます。
どうしたらいいのでしょうか?
たとえば、文字列中に数字が含まれないことが証明されているようでしたら、
Aを1に置換、Bを0に置換し、1をBに置換、0をAに置換すれば目的の動作は達成できると思い、
そのソースコードを作りましたが、
もしこの文字列に何のきまりもなく、数字も小文字アルファベットも記号も含まれるとしたら...
アドバイスお願いいたします。
###書いてみたソースコード
java
1public class Main{ 2 public static void main(String[] args){ 3 String s = new java.util.Scanner(System.in).nextLine(); 4 s = s.replaceAll("A","1"); 5 s = s.replaceAll("B","0"); 6 s = s.replaceAll("1","B"); 7 s = s.replaceAll("0","A"); 8 System.out.println(s); 9 } 10}
###補足
実際にコードを書くのは自分で頑張りますので、ヒントだけでも教えていただけると幸いです。
###追記
正規表現を使ったプログラムを書いてみたのですが
もっと効率よくならないか、悩んでいます。見ていただけませんでしょうか?
今回は、"abc"と"cba"の変換なので、どちらも3文字ですが、文字数が違う場合も想定して書いてみました。
java
1import java.util.Scanner; 2import java.util.regex.Pattern; 3import java.util.regex.Matcher; 4 5public class Main{ 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 String s = sc.nextLine(); //置換したい文字列を受け取る 9 10 //abcをcbaに、cbaをabcに置換する。 11 12 Pattern p1 = Pattern.compile("abc|cba"); 13 Matcher m; 14 15 int next = 0; //分割点 16 String result = ""; 17 18 while(true){ 19 m = p1.matcher(s); 20 if(m.find()){ 21 next = m.start(); 22 result += s.substring(0,next); //マッチした手前までをresultへ入れる 23 s = s.substring(next); //resultに入れた分を削除 24 25 if(s.substring(0,3).equals("abc")){ //マッチしたのが"abc"だったら 26 result+="cba"; //resultに"cba"を入れる 27 if(s.length()==3){ //マッチした部分が文の最後だったら 28 break; 29 } 30 s = s.substring(3); //残りの部分をsに入れる 31 }else{ 32 result+="abc"; 33 if(s.length()==3){ 34 break; 35 } 36 s = s.substring(3); 37 } 38 39 }else{ 40 result += s; 41 break; 42 } 43 } 44 System.out.println(result); 45 } 46} 47 48

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/13 05:01
2017/05/13 05:08
2017/05/13 05:18
2017/05/13 05:39