Javaの文字列置換の問題について

このQ&Aのポイント
  • Javaのプログラムで文字列の置換処理を行う際に、第二引数が複数存在する場合にうまく処理できない問題が発生しています。
  • 具体的には、第一引数に含まれる複数の第二引数を順番に置換すると、後半部分の置換が正しく行われないという問題です。
  • 対策としては、文字列を置換する際に、一度置換した部分を残し、再度置換処理を行う必要があります。具体的な実装方法については、コードの改良が必要です。
回答を見る
  • ベストアンサー

javaの問題です。

現在以下のようにプログラムを書いてみました。 public class Replace { public static void main(String[] args) { String str = args[0]; int num = str.indexOf(args[1]); while (num != -1){ str = ( str.substring(0, num) + args[2] + str.substring(num + args[1].length()) ); num = str.indexOf(args[1]); } System.out.println(str); } } 第一引数に第二引数が含まれていれば、それを第三引数に置換する、というものです。 上記にて第二引数が単体ならば動作するのですが、たとえば 第一引数:ABCBA 第二引数:AB 第三引数:C という風に第二引数を複数にすると、 結果がCCBAと後半のBAが変換されなくなってしまいました。 後半部分もAとBが含まれる、ということで、同じように変換出来るようにしたいのですがどのようにすればよいのでしょうか?;; どうぞよろしくお願いいたします;;

noname#220630
noname#220630
  • Java
  • 回答数3
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.3

ならばこうなります。 public class Replace { public static void main(String[] args) { String str = args[0]; for(int i=0;i<args[1].length();i++){ int num = str.indexOf(args[1].charAt(i)); while (num != -1){ str = (str.substring(0, num) + args[2] + str.substring(num + 1)); num = str.indexOf(args[1].charAt(i)); } } System.out.println(str); } }

noname#220630
質問者

お礼

何度もお手数をお掛けしまして本当に申し訳ありませんでした;; そして根気強くお付き合いくださいましてありがとうございました!

その他の回答 (2)

  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.2

AをCに変えてBもCに変えるということですか? 第一引数:ABCBA 第二引数:AB 第三引数:Cならば CCCCCという答えでしょうか? ならば第2引数を1文字づつ取り出してこの処理をすれば解決します。

noname#220630
質問者

お礼

ご回答ありがとうございました。

noname#220630
質問者

補足

おっしゃるとおり、CCCCCという答えにしたいのです。 最初からそのように質問できなくて申し訳ありません;; 一文字ずつ取り出す、というやり方もピンとこないのですが、charAtメソッドなどを使用するのでしょうか? 出来ましたらソースを書いていただけませんでしょうか・・・;

  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.1

テストしましたがなんともないようですよ。 具体的にどのようなコマンドを与えたら変換できなくなりますか? 書かれているような、「第一引数:ABCBA 第二引数:AB 第三引数:C」 であれば答えはCCBAが正しくて、第2引数ABを見てBAは変換されません。

noname#220630
質問者

お礼

ご回答ありがとうございました。

noname#220630
質問者

補足

ご回答ありがとうございます><;; 第二引数がABではなく、AとBという風に捉えて後半部分も変換出来るようにならないかと考えたのですが、それは正しくないということなのですよね。 全面的にソースを書き換えても出来るようになったりはしないものでしょうか・・・;;

関連するQ&A

  • javaの質問です。

    JAVAの質問です。 (replaceを使わない置換) java あいういあ あ !! > !!いうい!! 上のように、引数1に引数2の文字が含まれていればその文字を引数3に置き換えるという問題を解いているのですが、思うようにいきません。引数2が1文字なら簡単なのですが、2文字・3文字の場合が全く分かりません。また、replace系も使うことはできません(replacefirstなど)。 コード例を挙げて頂けないでしょうか? 丸投げなのは重々承知しておりますが、どうかよろしくお願い致します。 class Replace{   public static void main(String args[]){     String str=args[0];     int num = str.indexOf(args[1]);     while(num != -1){       str=(str.substring(0,num)+args[2]+str.substring(num+1));       System.out.print(str);     }     System.out.println();    } } 一応こんな感じかな?と思ってコードを作ってはいるのですが、結果としては散々です。。。

    • ベストアンサー
    • Java
  • 数値⇒漢数字変換 java

    こんにちは。java初心者の学生です。 実行時引数で得た数値を漢数字に変換するコードを書いているのですがif構文の&&のところで実行時エラーが出てしまいます。 原因としては1200001234と入力した時に”args[0].length()-12が存在しない”などがあげられると思いますが、下に載せたコード以外で兆、億、万桁が0の場合の対処方がわかりません。 御享受いただけると助かります。よろしくお願いします! public class Question14 { /** * 実行時引数で得た数字の漢数字変換 * @param args 数字 */ public static void main(String[] args) { StringBuffer num = new StringBuffer(args[0]); if(num.length()>20){ System.out.println("0~99999999999999999999の数値で入力してください。"); } else{ StringBuffer sb = new StringBuffer(); if(num.equals("0")){ System.out.println("零"); } else{ for(int keta = num.length()-1; keta>=0; keta--){ if(keta==args[0].length()-5 && !((num.substring(args[0].length()-8,args[0].length()-4).equals("0000")))){ sb.insert(0,'万'); } else if(keta==args[0].length()-9 && !((num.substring(args[0].length()-12,args[0].length()-8).equals("0000")))){ sb.insert(0,'億'); } else if(keta==args[0].length()-13 && !((num.substring(args[0].length()-16,args[0].length()-12).equals("0000")))){ sb.insert(0,'兆'); } else if(keta==args[0].length()-17){ sb.insert(0,'京'); } switch(num.charAt(keta)){ case'1': sb.insert(0,"一"); break; case'2': sb.insert(0,"二"); break; case'3': sb.insert(0,"三"); break; case'4': sb.insert(0,"四"); break; case'5': sb.insert(0,"五"); break; case'6': sb.insert(0,"六"); break; case'7': sb.insert(0,"七"); break; case'8': sb.insert(0,"八"); break; case'9': sb.insert(0,"九"); break; case'0': continue; default: System.out.println("数値を入力してください"); break; } if(keta==num.length()-2||keta==num.length()-6||keta==num.length()-10||keta==num.length()-14||keta==num.length()-18){ sb.insert(1,"十"); } else if(keta==num.length()-3||keta==num.length()-7||keta==num.length()-11||keta==num.length()-15||keta==num.length()-19){ sb.insert(1,"百"); } else if(keta==num.length()-4||keta==num.length()-8||keta==num.length()-12||keta==num.length()-16||keta==num.length()-20){ sb.insert(1,"千"); } } } System.out.println(sb); } } }

  • 今勉強中のjavaで。わからないことがあります。

    import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int num =Integer.parseInt(str1); System.out.println("あなたは" + num +"歳です。"); } } ------------------------------- import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("あなたは" + str1 +"歳です。"); } } なぜ下では悪いのですか?なぜnum をつかないといけないかがわかりません。正確には str1とnumの違いがわからなくて困っています。何が混乱の原因ですか?

    • ベストアンサー
    • Java
  • このJavaの問題につきまして

    現在Javaの勉強をしているものです。 この問題は私が3時間ほど考えてみたのですがどうしてもわからなくて今回はみなさんに質問をさせていただきました。  問題文の後に私なりに考えたプログラムをまだ途中ではありますが載せておきました。その以降の部分に関しましてどうか答えを教えてください。また途中まで載せている私が作成したプログラムに関しましてもおかし点がありましたらどんどんご指摘なさって結構です。 問題  検索文字列と検索文字をカンマで区切り引数として画面から渡し、メインメソッドからサブメソッドにその引数をを渡し、サブメソッドで検索文字列に検索文字があれば何番目にその文字があるかを返し、該当文字がない場合は0を返します。 メインメソッドで何番目がその文字であるかを出力する処理ex.)  引数:Really a (メニューバーの「実行」をクリックして、中にある「実行」をクリっクし、そこの「引数」という項目に「Really a」と入力する」  出力結果:文字列「Really」のaは3番目にあります。 public class Moji{ public static void main(String[] args){ String str = args[0]; System.out.println(kensaku(str)); } static String kensaku(String str){ StringTokenizer A = new StringTokenizer(str,","); //↓の2行はあまり自信がありません・・・ while(A.hasMoreTokens()); System.out.println(A.nextToken()); //↓ここからわかりません } どうかよろしくお願いします

  • for文を使った累乗の計算方法について

    質問させてください。 for文を使った累乗の計算プログラムを作っています。 数値はコマンドライン引数から取得し、0番目の数字を i番目の数字分累乗するというものです。 ソースを途中まで作成したのですが、0乗した場合のプログラムが よく分かりません。どなたか教えていただけないでしょうか? public class Mondai { public static void main(String[] args) { //変数の初期化 int k = 0; if ( 2 <= args.length && args.length < 3) { //コマンドライン引数の数だけ配列を用意する int[] num = new int[args.length]; //0,1番目のコマンドライン引数を整数に変換してnumに代入する num[0] = Integer.parseInt(args[0]); k = num[0]; k *= k; num[1] = Integer.parseInt(args[1]); //num[1]の掛け算をnum[1]回繰り返す for (int i = 0; i < num[1] -2; i++) { k *= num[0]; } System.out.println("\"" + num[0] +"の" + num[1] + "乗は"+ k + "\""); if(num[1] == 0) { System.out.println("\"" + num[0] +"の" + num[1] + "乗は1\""); } //args.length <= 1の条件の時 } else if(args.length <= 1) { System.out.println("引数が足りないため累乗の計算ができません。"); //指定された条件以外の時 } else { System.out.println("引数が多すぎるため累乗の計算ができません。"); } } }

    • ベストアンサー
    • Java
  • Scanner と BufferedReader

    javaでキーボードからの入力を格納するやつがあって、 Scanner と BufferedReaderのやり方がありますが、これはどう違うのでしょうか? それとも全く同じでしょうか? たとえば、 ■一つ目 import java.io.*; class Sample3{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列を入力してください"); String str1=br.readLine(); System.out.println("検索文字を入力してください"); String str2=br.readLine(); char ch=str2.charAt(0); int num=str1.indexOf(ch); if(num !=-1) System.out.println(str1+"の"+(num+1)+"番目に「"+ch+"」が見つかりました"); else System.out.println(str1+"に「"+ch+"」はありません"); } } ■二つ目 import java.util.Scanner; class Sample4{ public static void main(String[] args){ Scanner stdIn=new Scanner(System.in); System.out.println("文字列を入力してください"); String str1=stdIn.nextLine(); System.out.println("検索文字を入力してください"); String str2=stdIn.nextLine(); char ch=str2.charAt(0); int num=str1.indexOf(ch); if(num !=-1) System.out.println(str1+"の"+(num+1)+"番目に「"+ch+"」が見つかりました"); else System.out.println(str1+"に「"+ch+"」はありません"); } } これら2つは全く同じ実行結果が得られると思うのですが、 Scanner と BufferedReader の使い分けるべき場合などあるのでしょうか?

    • ベストアンサー
    • Java
  • javaの質問です 合ってるかをお願いします

    間違ってる場合は何が正解かを教えてください。 よろしくお願いします 1 変数strには何が入っているか test 2 dataとstrの関係 わからないです。 public class Example5 { public static void main( String[] args ) { String data = "test."; hyouji( data ); } static void hyouji( String str ) { System.out.println( str ); } }

    • ベストアンサー
    • Java
  • Javaの参照渡し

    以下のようなプログラムで望むような結果(下に書いてある実行結果)は得られるでしょうか。 class HelloWorld {   public static void main(String[] args)   {     String str;     makeString1(str);     System.out.println(str);     makeString2(str);     System.out.println(str);   }   public static void makeString1(String str)   {     String words = "HelloWorld!";     str = words;   }   public static void makeString2(String str)   {     str = "HelloWorld!!";   } } ---実行結果--- HelloWorld! HelloWorld!!

    • ベストアンサー
    • Java
  • 【Java】複数の引数の数値と文字列の判定

    Javaについてです。 コマンドライン引数を複数渡し、渡ってきた値が数字のみの場合は、数値*数値の文字数を出力し 数字のみでない場合は文字列を逆から1文字ずつ出力する。 数値の判定はtry/catchで行い、catchメソッドには「stringFlg = true;」のみにする。 というプログラムを作りたいのですが、 引数が1つの時は上手くいくのですが、11 2あ あ3 44を渡した場合、 22 あ 2 3 あ 88 と出るはずが、 22 1 1 あ 2 3 あ 4 4 と出てしまいます…。 どうしたら全ての引数を正しく表示出来るのでしょうか?教えて下さい。 現時点のソースコードです。 public class Test { public static void main(String[] args) { boolean stringFlg = false; try { if(StringUtils.isNumeric(args[0])){ for(String arg : args) { int num = Integer.parseInt(arg); System.out.println(num * arg.length()); } } else{ stringFlg = true; } } catch (NumberFormatException e) { stringFlg = true; } if(stringFlg){ for(String val : args) { String[] str = val.split(""); for(int i = str.length-1; i >= 0; i--){ System.out.println(str[i]); } } } } }

    • ベストアンサー
    • Java
  • javaプログラムについて

    コマンドライン引数から複数の値を受け取り、それらの最大と最小を表示する、というプログラムなのですが。 class Maxmin{   public static void main (String[] args) {    int max=Integer.MIN_VALUE;    int min=Integer.MAX_VALUE;    for (int i=0; i<args.length; i++){     int num= Integer.parseInt(args[i]);     if(num>max)     max=num;     if(num<min)     min=num;    }    System.out.println("最大値は" + max + "です。");    System.out.println("最小値は" + min + "です。");  } } このプログラムでも問題なく表示されるのですが、MIN_VALUEとMAX_VALUEを使用せずに表示する事、と指摘を受けました。自分の中でぱっと思いついたのがこれだったのですが、他にはどのような方法があるのでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう