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

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

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

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

Q&A

解決済

8回答

1429閲覧

無駄な記述をなくしたい

nekocat

総合スコア7

Java

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

1グッド

0クリップ

投稿2018/05/30 07:52

前提・実現したいこと

お世話になります。
初めての質問でお見苦しい点多々あると思いますが、ご容赦下さい。
ネットで見かけたJavaの問題を解いております。

改善したい点

一応コンパイル・実行ともにでき、やりたいことはできたのですが、
該当のソースコードの★の部分が同じ処理をしているため、
str.indexOf(args[1])を1回だけ使うように
書き換えることはできないかと思い、今回質問させていただきました。

該当のソースコード

class Mondai3{ 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); } } /* コマンドライン引数↓ たけやぶにたけたてかけた たけ 竹 実行結果↓ 竹やぶに竹たてかけた */

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

Eclipce

swordone👍を押しています

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

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

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

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

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

guest

回答8

0

replaceを使わずに、省略したいなら、こんな感じ?

Java

1class Mondai3{ 2 public static void main(String[]args){ 3 4 String str = args[0]; 5 int num; 6 7 while((num = str.indexOf(args[1])) != -1){ 8 str = (str.substring(0,num) + args[2] + str.substring(num + args[1].length())); 9 } 10 11 System.out.println(str); 12 } 13}

投稿2018/05/30 08:19

macaron_xxx

総合スコア3191

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

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

nekocat

2018/05/30 08:29

やはりnumの宣言を外に出すのがよさそうですね! ありがとうございます。
guest

0

1回探索したところは2度探索しないように改良
ついでにコマンドライン引数の内容がどれがどれかわかりにくいため変数名を付けた

java

1class Mondai3{ 2 public static void main(String[]args){ 3 4 String str = args[0]; 5 String target = args[1]; 6 String replacement = args[2]; 7 8 int num = 0; 9 10 while((num = str.indexOf(target, num)) != -1){ 11 str = (str.substring(0,num) + replacement + str.substring(num + target.length())); 12 num += replacement.length(); 13 } 14 15 System.out.println(str); 16 } 17}

投稿2018/05/30 15:21

swordone

総合スコア20651

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

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

0

自分でループを回す場合、無限ループにならないようにする注意が必要です。
失眠分のコードに、
たけやぶにたけたてかけた たけ 竹たけ
をコマンドライン引数に指定したらどうなるでしょう?

ループさせずに済ます方法と、ループをさせる方法の2つを書いてみました。

java

1import java.util.Arrays; 2import java.util.List; 3 4public class Mondai3 { 5 public static void main(String[] args) { 6 List<String> words = Arrays.asList(args[0].split(args[1])); 7 System.out.println(String.join(args[2], words.toArray(new String[words.size()]))); 8 9 final int src_len = args[1].length(); 10 if (src_len == 0) { 11 System.out.println(args[0]); 12 return; 13 } 14 String ans = ""; 15 int p = 0; 16 while (p < args[0].length()) { 17 if (args[0].substring(p).startsWith(args[1])) { 18 ans += args[2]; 19 p += src_len; 20 } else { 21 ans += args[0].charAt(p); 22 p += 1; 23 } 24 } 25 System.out.println(ans); 26 } 27} 28/* 29 * 入力: たけやぶにたけたてかけた たけ 竹 30 * 出力: 竹やぶに竹たてかけた 31 * 32 * 入力: たけやぶにたけたてかけた たけ 竹たけ 33 * 出力: 竹たけやぶに竹たけたてかけた 34 */

投稿2018/05/30 14:08

編集2018/05/30 14:10
katoy

総合スコア22324

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

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

0

Javaでやるのは文化的に受け入れられるかわからないですが、ループ自体を無限ループにしておいて、途中脱出にすればindexOfの記載は1箇所で済ませられます。

java

1 while(true){ 2 int num = str.indexOf(args[1]); 3 if(num == -1) break; 4 str = (str.substring(0,num) + args[2] + str.substring(num + args[1].length())); 5 }

投稿2018/05/30 08:19

maisumakun

総合スコア145184

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

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

nekocat

2018/05/30 08:35 編集

ご回答ありがとうございます。 Javaの教科書でも見たことがあったので大丈夫だと思います! (ただbreakの条件があるのに無限ループとは…?と見るたびに混乱します(笑)) ありがとうございました!
guest

0

ベストアンサー

breakすればいいじゃない。

while(true){ int num = str.indexOf(args[1]); if(num == -1){ break; } str = (str.substring(0,num) + args[2] + str.substring(num + args[1].length())); }

投稿2018/05/30 08:15

tkturbo

総合スコア5572

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

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

nekocat

2018/05/30 08:32

ご回答ありがとうございます。 無限ループですね!(でもこの場合はbreakしているので無限ではないのでしょうか...???) また違った発想だったので面白かったです!ありがとうございます。
guest

0

replace関数を使うのはダメなんでしょうか?

Java

1class Mondai3{ 2 public static void main(String[]args){ 3 System.out.println(args[0].replace(args[1], args[2])); 4 } 5}

投稿2018/05/30 08:02

macaron_xxx

総合スコア3191

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

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

nekocat

2018/05/30 08:05

ご回答ありがとうございます。 今回アルゴリズムを学ぼうと思っており、replaceは使わないように やってみようと試行錯誤中なのです。 ご助言ありがとうございます!
guest

0

String#replaceを使えば数行で全体を代替可能です。

Java

1System.out.println( 2 args[0].replace(args[1], args[2]) 3);

投稿2018/05/30 07:59

編集2018/05/30 08:00
LouiS0616

総合スコア35660

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

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

nekocat

2018/05/30 08:06

ご回答ありがとうございます。 今回アルゴリズムを学ぼうと思っており、replaceは使わないように やってみようと試行錯誤中なのです。 ご助言ありがとうございます!
guest

0

ループの中でstrが変化する以上、2個めのindexOfは省略できないですね

投稿2018/05/30 07:57

y_waiwai

総合スコア87774

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

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

nekocat

2018/05/30 08:33

ご回答ありがとうございます。 そうですよね...書き方に一工夫いりそうです。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問