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

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

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

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

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

5546閲覧

Java 配列内の探索と入力した文字への置き換え

yukiusagi3

総合スコア1

Java

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

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/07/21 10:35

編集2021/07/21 12:58

前提・実現したいこと

お忙しいところ、申し訳ありません。
Javaを勉強中の初心者です。

キーボードより文字列を入力し、入力した文字列の文字を1文字ずつ配列に格納。(配列は可変長なものとします)
キーボードから「置き換え対象」と「置き換えたい文字」を入力してもらい、(できれば1文字から可変長まで対応したい)
最初の配列の中から「置き換え対象」の文字を探して、「置き換えたい文字」に置換するプログラムを作っています。

最終目標はこんな感じで表示させたいです。

文字列を入力してください
HELLO
置換する文字を入力してください
L
置換後の文字を入力してください
O
配列の中身の表示:HELLO
置換後の中身の表示:HEOOO

発生している問題・エラーメッセージ

最後の配列から対象を探して置換するところで、つまずいています。
1文字ずつ配列に格納するためchar型で格納して、配列の中身だけString型に変換して比べた方がいいんでしょうか・・・。
cherからStringに変換するには String.valueOfを使えばよさそうなので、
ばらばらにして格納するところで戻そうと試みて、うまく型変更出来てません。
なので、探索段階で型違いのエラーが出てしまい、うまくif文につなげられなくて、
もだえ苦しんでいます。

32行目で「この行に複数マーカーがあります。非互変オペランド型charとString。iを変数に解決できません」

該当のソースコード

import java.util.Scanner;

public class mondai1 {

public static void main(String[] args) { System.out.println("文字列を入力してください"); //キーボードより文字列を入力 Scanner sc = new Scanner(System.in); //中身を代入する(切り出しする文字列) String text = sc.nextLine(); //代入した文字数の分だけ配列を作る char[] work =new char[text.length()]; //一文字ずつ配列に値を代入する for(int i = 0; i < text.length(); i++) { work[i] = text.charAt(i); //char型をString型に直す(これでいいのかな・・・中身の型が変わらない。) //(添え字が変ってるとか!) String.valueOf(i); } //キーボードから置き換え対象文字の入力 System.out.println("置換する文字を入力してください"); String input = new Scanner(System.in).nextLine(); //キーボードから置換した後の文字を入力 System.out.println("置換後の文字を入力してください"); String output = new Scanner(System.in).nextLine(); //その文字に置き換える。(わからない・・・) if (work[i] == input) { /*やりたいこと 配列workの中身とinputを比べて、 同じなら、outputに上書きするみたいな感じで書きたいけど出来ない・・・ (助けて・・・) */ } }

}

試したこと

キーボードから入力したString型の文字列をChar型に変換できないか試すが、
式を入力してもうまく変換できないようだった(同じエラーが出る)多分知識不足。

配列workの中身をchar型からString型に変換できないか試す。
配列の添え字か番地あたりが変換されているのか中身が変わっていない感じがする。

入力された「置き換え対象」と「置き換えたい文字」を配列にして比べるのを試す。
入力された文字をバラバラにキャラ型の配列に入れるまではなんとかできた。
(配列の中身同士を比べて交換するif文を思いつけなかったため断念)

if文で配列の中身と入力された「置き換え対象」「置き換えたい文字」を比べようと必死になる。
(調べたけれどうまくできるものが発見できず断念)

補足情報(FW/ツールのバージョンなど)

java 16を使ってます。
エディタはエクリプス最新バージョンです。

自分で解決しようと踏ん張ったのですが、出来ませんでした。
どなたか、お知恵をお持ちの方、いらっしゃいましたら、どうかお願いいたします。

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

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

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

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

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

jimbe

2021/07/21 11:03

String には文字列の(別に指定した文字列に一致する)部分を別の文字列に置き換えるメソッド( replaceAll 等)があったはずですが、それを使ってはいけないのでしょうか。
javahack

2021/07/21 11:04

ソースコードは画像ではなく、テキストをコピーして張り付けてください。 マークダウン記法を使ってコードを見やすく整えてください。 https://teratail.com/help#about-markdown
BeatStar

2021/07/21 11:06

コードは画像での質問はやめましょう。 識別できないし、できても、 『再現率が低くなる』です。 たとえば、『半角スペースにすべきところを全角スペースにしているのが原因』だったりします。 そうなると『わかりません』。 だって、『反転させてやっとわかるもの』ですから。 なので画像での質問はやめましょう。
javahack

2021/07/21 11:07

charなんかに変換しようとせず、普通に1文字づつ切り取って配列に入れれば良いのでは。 画像のソースコードなのでちゃんと見ていないけど、文字列の比較に "==" はご法度(Javaでは)。
dodox86

2021/07/21 11:08

初心者と自称されているところに失礼を承知で指摘しますが、結構メチャクチャです。入力でのScannerの使い方もかなり無理があります。なぜ、(現段階では質問者さんにとって)難しいと思える問題をやろうとするのでしょう。何かの課題でしょうか? 問題を分解してひとつひとつ理解し、片付けていった方が良いと思います。
dodox86

2021/07/21 11:13

どうでもいいですが、仕事の依頼ではないので > お忙しいところ、申し訳ありません。 と言うお伺いはこのような場では不要です。(気を遣ってのことだと思いますが、虚礼です)
Zuishin

2021/07/21 11:14

課題を投げたのがバレないように画像で投稿。
yukiusagi3

2021/07/21 12:14

迅速な対応ありがとうございます。 初心者すぎてご迷惑おかけします。 画像を貼ってしまい申し訳ありません。 以後気を付けます。 >>jimbeさま ご指摘ありがとうございます。調べます。 >>javahackさま 画像でご迷惑おかけいたしました。すみません。 1文字ずつ切り取って配列に入れてみます。 ==はいけないんですね。知りませんでした。 ありがとうございます。 >>BeatStarさま ご指摘ありがとうございます。気を付けます。 エラーメッセージの意味を解読する頭がありませんでした。 もう一度読み直してきます。 >>dodox86 テキストと同じよう作るのは出来るのですが、 文章だけのものだと、全然作ることができません。 稚拙で申し訳ありません。 これは、企業説明会のお題で、誰に聞いても、何を見てもいいとのことでした。自分でも恥ずかしいレベルで本当にお目汚し申し訳ないです。 馬鹿すぎて、どうすればよいかわからなくなってしまいました。 皆様のコメントを読んでもう一度、やってみます。 >>Zuishinさま 画像投稿してしまい、申し訳ありませんでした。
Zuishin

2021/07/21 12:16

どう見ても手慣れすぎていて初投稿には見えないけど、とりあえず直しなさいよ。
yukiusagi3

2021/07/21 12:36

>>Zuishin様 手慣れてるように見えるのでしたら、申し訳ないですが、初めてです。 投稿してから直す方法ありますか? 恥ずかしいので直したいです。
BeatStar

2021/07/21 12:43

投稿者(回答なら回答者、質問なら質問者)は編集ができるので編集しましょう。
BeatStar

2021/07/21 12:45

質問者さん 発想の方向性は私の回答貼ってあるリンク先を参考にしてください。
yukiusagi3

2021/07/21 12:59

写真削除編集できました。ありがとうございます。
dodox86

2021/07/21 13:02

>@質問者さん オフトピックだし私は回答を避けるつもりですし大きなお世話でしょうが、ご家庭の事情があってリモートワークの選択肢として初心者ながらもプログラマーを目指すのであれば、強力にお勧め出来ないものです。たぶん、その企業さんに試されていますね。ほったらかしでも案件を片付けられるか。
yukiusagi3

2021/07/21 13:05

>>BeatStar様 さっそく読ませていただきます!ありがとうございます。
BeatStar

2021/07/21 13:13 編集

私もdodox86さんに同意ですね。 某スクールとかのCM(最近、YouTubeで見た)では 『勉強? 努力? そんなもん必要ない』とかみたいに謳っているようですが、 『そんなものはマヤカシ』です。 基礎だけなら数ヶ月程度でできるかもしれませんが、趣味程度でも使えるようになるだけで十数年はかかります。 それにIT業界はまだ過酷らしいです。 (少なくともブラックなところも少なくないらしい…) なのでおすすめできませんね。 茨の道だと覚悟してであれば構いませんが。
guest

回答4

0

ベストアンサー

Stringクラスの replaceメソッドを使ってはいけないのですか?

Java

1class Main { 2 public static void main(String[] args) { 3 System.out.println("HELLO".replace("L", "O")); 4 } 5}

質問のコードは Scanner の使い方を間違っています。
1つの標準入力(System.in)に対して、new で
複数の Scannerオブジェクトを生成してはいけません。
標準入力がキーボードだからたまたま上手く行っているだけです。
標準入力をファイルに切り替えると破綻します。
最初に生成したオブジェクトを指す sc を使って nextLineしてください。

追記
どうしても、char配列に置き換えて置換を行いたいのであって、
置換する文字が 1文字なら次のようなコードが欠けます。

Java

1class Main { 2 public static void main(String[] args) { 3 String s0 = "HELLO"; 4 String s1 = "L"; 5 String s2 = "O"; 6 char[] a0 = s0.toCharArray(); // String を char[] に変換 7 char[] a1 = s1.toCharArray(); // char c1 = s1.charAt(0); 8 char[] a2 = s2.toCharArray(); // char c2 = s2.charAt(0); 9 for (int i = 0; i < a0.length; i++) 10 if (a0[i] == a1[0]) a0[i] = a2[0]; // if (a0[i] == c1) a0[i] = c2; 11 s0 = String.valueOf(a0); // char[] を String に変換 12 System.out.println(s0); 13 } 14}

置換文字列が 2文字以上だったり、置換する長さが違ったりする場合はどうしましょうか?

投稿2021/07/22 02:41

編集2021/07/22 07:02
kazuma-s

総合スコア8224

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

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

yukiusagi3

2021/07/28 09:05

Kazuma-s様 ありがとうございます!大変参考になりました! char型で配列に入れなおすところがお見事すぎて涙がでました。 私には発想できない領域でした。 replaceメソッド、調べてみたらすごく良いメソッドでした。使って書いてみます。 1文字の場合は、これで出来ますね!すごいです。 2文字、3文字になったらreplaceでも厳しそうな感じもします。
kazuma-s

2021/07/28 11:35

> 2文字、3文字になったらreplaceでも厳しそうな感じもします。 そんなことはありません。試していないのですか? また、質問でソースの投稿にも失敗しています。 「質問への追記・修正依頼」でも指摘されています。 このページの下の「> ヘルプ」をクリックして、表示されたページの 「質問するときのヒント」をよく読んでください。 そして、質問を編集して、コードの貼り付け方を修正してください。
guest

0

何のコードも無いのでは勉強にするにも手がかりが無いかもしれませんので。

String 型のまま切り貼りしています。

Mondai.java (クラス名は大文字で始めるのが java 流です)

java

1import java.util.Scanner; 2 3public class Mondai { 4 public static void main(String[] args) { 5 String str, target, replacement; 6 7 // sc :キーボードから行入力するためのオブジェクト 8 try(Scanner sc = new Scanner(System.in);) { 9 10 //文字列を入力 11 System.out.println("文字列を入力してください"); 12 str = sc.nextLine(); 13 14 //置き換え元の文字列の入力 15 System.out.println("置換元の文字列を入力してください"); 16 target = sc.nextLine(); 17 18 //置き換え先の文字列を入力 19 System.out.println("置換先の文字列を入力してください"); 20 replacement = sc.nextLine(); 21 22 } // sc はもう使わないので閉じる 23 24 //置き換え 25 int fromIndex = 0; 26 while(true) { //無限ループ 27 int index = str.indexOf(target, fromIndex); //target を探す 28 if(index < 0) break; //無かったら, 無限ループ終わり 29 str = str.substring(0,index) + replacement + str.substring(index+target.length()); //置き換え 30 fromIndex = index + replacement.length(); //次に探し始める位置 31 } 32 33 //結果を出力 34 System.out.println("置換結果です"); 35 System.out.println(str); 36 } 37}

char型配列にして一文字を置換するなら、置き換えの部分を以下のようにする感じで如何でしょう。

java

1 //置き換え 2 char[] strChars = str.toCharArray(); //これで str の全文字が char 型になります 3 char targetChar = target.charAt(0); //置換元文字列の最初の文字 4 char replacementChar = replacement.charAt(0); //置換先文字列の最初の文字 5 for(int i=0; i<strChars.length; i++) { 6 if(strChars[i] == targetChar) strChars[i] = replacementChar; 7 } 8 str = new String(strChars);

投稿2021/07/21 15:02

編集2021/07/21 15:22
jimbe

総合スコア12646

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

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

yukiusagi3

2021/07/28 09:07

jimbe様。ありがとうございます! 置き換え部分を考えるところで詰まってたのでとても参考になりました。 本当にありがとうございます。
guest

0

皆様のコメントを参考にして以下のように書き直しました。動作確認済み。
感無量です!ありがとうございました!!

import java.util.Scanner;

public class mondai1 {

public static void main(String[] args) { System.out.println("文字列を入力してください"); //Scannerクラスの呼び出し Scanner sc = new Scanner(System.in); //入力した文字列をlineに格納 String line = sc.nextLine(); System.out.println("置換する文字を入力してください"); //入力した文字列をbefoerに格納 String before = sc.nextLine(); System.out.println("置換後の文字を入力してください"); //入力した文字列をafterに格納 String after = sc.nextLine(); //文字列置換する System.out.println(line.replace(before, after)); }

}

投稿2021/07/28 09:10

yukiusagi3

総合スコア1

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

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

0

エラーメッセージぐらいは読みましょう

エラーメッセージにヒントが隠されています。

今回は『char型データとStringデータを比較していることが原因』です。

work[i] とはなんでしょうか。
inputとは何でしょうか。

別のものを比較しているのが原因。

だから、char同士でやるか、String同士でやるかでしょうか。
(エラーを回避するだけなら)


[追記1]

本当にやる気があるのなら私の過去回答を参考にして下さい。

私の回答でなくても良いですが、言いたいことは上記ページにほとんど書いているので。
(言葉足らずな部分はあるけど…)

投稿2021/07/21 11:12

編集2021/07/21 12:30
BeatStar

総合スコア4958

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

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

dodox86

2021/07/21 11:17

エラーメッセージだけの問題ではないのは明白なのですから(<と少なくとも私には思えているのですが)、少々回答が拙速なのではないでしょうか。
BeatStar

2021/07/21 11:22

dodox86さん ですね……
yukiusagi3

2021/07/21 12:18

すみません。頑張ってみたんですけど、ひどいですよね。 投稿してしまって申し訳ないです。 もう一度調べなおしてみます。
BeatStar

2021/07/21 12:27

質問者さん 質問したりすること自体はいいのですが、『基礎を蔑ろにすること』や 『質問方法を工夫しないこと』や 『自分なりにやろうとしないこと』がダメと言われるのです。 私も『基礎からやりましょう』と書きたかったですが、質問者によっては逆ギレする人がいるので、『やんわりと』書いたつもりです。
yukiusagi3

2021/07/21 12:46

>>BeatStarさま 基礎が大事ということだったので、ネットに書いてあった入門書を一通り読んで練習したのですが、 いざ、自由に書けとかこういう風な・・・とか言われると、ものすごい壁を感じます。 少し物まね出来るようでは本当の実力とは言えないと痛感しています。 ほんと職業にされてる方々ってすごいんだなって感服します。 私も体が悪いし介護もしなければならなくて、肉体労働が出来ず、人に薦められて始めたのですが、 奥深さに日々驚いています。 自分で考えて書ける人ってほんとすごいですね。 貴重なご意見ありがとうございます。
BeatStar

2021/07/21 12:55

※ あ、ちなみに私は趣味でやっています まず、私の過去回答を参考にやってみてください。 リンク先ではECサイトの場合だのなんだのと書いていますが、発想は課題とかでも一緒ですよ。 (あの方法を理解するのに10年近くかかりました…)
yukiusagi3

2021/07/21 13:04

>>BeatStar様 趣味なんですね!すごい! きっと楽しみながら出来るから上達が早いんですね。 私も早く楽しめるレベルにまで行きたい・・・。 過去回答読ませていただきます。ありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問