質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

3036閲覧

文字列の置換えについて

takamaso

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/04/26 18:37

プログラミングを学び始めて一ヶ月弱の初心者です
文字列の置換えについてです

例えば123456という文字列があったとします。

これを1を3に、2を4に、4を5に、5を1に置き換えるプログラムとして
343516という値にしたいんですが
String str = "123456";
str = str.replace("1","3");
str = str.replace("2","4");
str = str.replace("4","5");
str = str.replace("5","1");
こうすると、313116という値になってしまいます。
置き換えたものが更に置き換わってしまうため
こうなってしまうのだと思うのですが他のやり方がわかりません・・・
一度置き換えたものを次から置き換えさせないようにするにはどうすればいいのでしょうか?
それよりもっといい方法があるのでしょうか?助けてください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

現状の「文字列123456の全ての文字を順番に置き換えていく」という方法ではなく、「文字列123456を前から順にルールに従って変換していく」という方法のほうがケースによっては有用です。

つまり

1.123456という文字列が与えられる
2.1を3に変換する
3.2を4に変換する
・・・

ではなく

1.123456という文字列が与えられる
2・前から順に文字を一つ取り出す(例えば最初の文字は1)
3.取り出した文字についてルールに従った変換をかける(1を3に、2を4に、4を5に、5を1に)
4.次の文字を取り出す(次の文字は2)
5.取り出した文字についてルールに従った変換をかける(1を3に、2を4に、4を5に、5を1に)
・・・

です。
この手順で処理をすれば、「既に変換した文字が次の処理の変換対象になってしまった」というようなことは発生しません。
また、「ルールに従った変換をかける」という処理は関数として別の処理に切り出すこともできます。

marimom7さん、katoyさんの示して下さったコードともに上記のような考え方です。

ただし、例えば実は対象文字が100万文字に及ぶのだということであれば、上記は順次処理になりますので処理速度に問題が出る可能性があります。
そうなると置き換え用の文字を用いるmaiko0318さんのような方法のほうが有用かもしれません。

投稿2017/04/26 23:32

編集2017/04/26 23:47
akabee

総合スコア1947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/04/27 02:03

replaceも結局順次処理(だったはず)なので、こっちが1ループで済む分速いと思いますよ。
akabee

2017/04/27 03:44 編集

ご指摘ありがとうございます。 そうなのですね、replaceの仕様については個人的にも調べてみます。
takamaso

2017/04/28 11:18

問題に対する考え方の流れを説明してくださりわかりやすかったです。ありがとうございました!
guest

0

ベストアンサー

文字列を先頭から1文字ずつなめていきます。
1文字ごとに置換処理をしながら、結果の文字列を作っていくようにしてみました。

イメージ説明

投稿2017/04/26 22:17

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

java

1str = str.replace("1","3"); 2str = str.replace("2","4"); 3str = str.replace("4","5"); 4str = str.replace("5","1");

出てこないものに一旦変換すればいい

str = str.replace("1","a");
str = str.replace("2","b");
str = str.replace("4","c");
str = str.replace("5","d");

そして戻す
str = str.replace("a","3");
str = str.replace("b","4");
str = str.replace("c","5");
str = str.replace("d","1");

投稿2017/04/26 21:20

maiko0318

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

考え方としては色々ありますがまずは基本となるstrデータは触らずに、別変数に自分が要求したデータを作るようにしましょう。
strデータを基準として考えれば難しくは無いと思います。
1ヶ月ということなのでどこまでプログラミングの知識が蓄えられているか分かりませんが例えば1という文字を9に変換する際には下記のような書き方が可能です
(対象言語が不明なためC++の例です)

C++

1#include <iostream> 2using namespace std; 3int main(void){ 4 string str = "123456"; 5 string str2 = "000000"; 6 7 for(int i = 0; i < str.size(); i++){ 8 if(str[i] == '1'){ 9 str2[i] = '9'; 10 }else{ 11 str2[i] = str[i]; 12 } 13 } 14 15 cout << str2 << endl; 16}

上記に必要な知識としてはchar型、string型、if構文、for構文、配列などです
参考になればと思います

追記
失礼しました、Java言語でしたね。
下記のような例です。

Java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3 4public class Main { 5 public static void main(String[] args) throws Exception { 6 String str = "123456"; 7 String str2 = ""; 8 9 for(int i = 0; i < str.length(); i++){ 10 if(str.charAt(i) == '1'){ 11 str2 += "肉"; 12 }else{ 13 str2 += str.charAt(i); 14 } 15 } 16 17 System.out.println(str2); 18 } 19} 20

文字列の中にある1という文字をなんと肉に変換してしまいます。
Stringのメソッドで、strの文字を1つずつ抜き出し、文字が1かどうか判定して1なら肉を、それ以外ならstrの文字をstr2に入れているという仕組みになります。

投稿2017/04/26 19:07

編集2017/04/26 19:32
marimom7

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問