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

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

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

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

Q&A

4回答

298閲覧

文字列操作のやり方について

orangeLover

総合スコア11

Java

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

0グッド

0クリップ

投稿2018/11/12 01:29

編集2018/11/12 01:52

お世話になっております。

教本を見ながら、
-(ハイフン)でコマンドライン引数で受け取った文字列を区切り、
1つずつ表示させるプログラムを書いています。
(※アルゴリズムの考え方の勉強のため、splitや正規表現の使用は意図的に避けています。)

一応仕様通りに動くものはできたのですが、後学のため
他のやり方も知りたいと思い、質問させていただきました。

そこで思ったのが、変数のindexを1つだけにすることは
できるのでしょうか?(=indexかindex2をなくす)
(「変数の数はなるべく少ない方が良い」と書籍で以前読んだので...)

他のやり方でも構いませんので、アドバイスを頂けると幸いです。

Java

1 2package nosplit; 3 4public class NoSplit { 5 6 public static void main(String[] args) { 7 8 int index = 0; 9 10 int index2 = 0; 11 12 String word = args[0]; 13 14 while (true) { 15 16 index2 = word.indexOf("-", index); 17 18 if(!(-1 == index2)){ 19 20 System.out.println(word.substring(index,index2)); 21 22 index = index2 + 1; 23 24 } else { 25 26 index = word.lastIndexOf("-"); 27 28 System.out.println(word.substring(index + 1)); 29 30 break; 31 } 32 33 } 34 } 35}

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

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

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

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

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

swordone

2018/11/12 01:34

このコードで仕様通りに動くとは思えません。そもそもbeginIndexはどこ?
guest

回答4

0

「変数の数はなるべく少ない方が良い」と書籍で以前読んだので...

変数の数が多いと挙動を追いづらくなるのは確かですが、
減らすと可読性が上がる、バグが出づらくなるとは一概には言えません

どちらかと言うと、変数の影響範囲を狭める方が実際的でしょう。
文字列を指定の文字で分割し、分割後の配列を返すstaticメソッドを書いてみると便利です。

Java

1static String[] mySplit(String src, String delimiter) { 2 String[] ret = new String[src内のdelimiterの個数 + 1]; 3 ... 4 5 return ret; 6}

納得のいくメソッドができたら、
mainメソッド内の mySplit(str, ",") を str.split(",") に差し替えれば良いです。

投稿2018/11/12 04:24

LouiS0616

総合スコア35660

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

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

0

文字列を文字に分解し、それがハイフンなら改行しそれ以外ならそのまま出力します。

Java

1public static void main(String[] args) { 2 args[0].chars().forEach(i -> System.out.print(i == '-' ? System.lineSeparator() : (char)i)); 3}

投稿2018/11/12 02:47

YamakawaJunichi

総合スコア630

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

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

0

やるんだとしたら、「残りの文字列」を毎回生成することとかかな…

java

1package nosplit; 2 3public class NoSplit { 4 5 public static void main(String[] args) { 6 7 int index = 0; 8 9 String word = args[0]; 10 11 while ((index = word.indexOf("-")) >= 0) { 12 13 System.out.println(word.substring(0, index)); 14 15 word = word.substring(index + 1); 16 17 } 18 19 System.out.println(word) 20 } 21}

ただやはりStringの生成はコストがかかるので、変数を減らすことにこだわるよりもStringの生成回数が少ないほうを選んだほうがいいです。

投稿2018/11/12 02:06

swordone

総合スコア20651

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

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

orangeLover

2018/11/12 02:38

迅速なご回答、ありがとうございます。 なるほど...ケースバイケース、ということなのでしょうか? >Stringの生成回数 これは String something = ""; のことでしょうか?
guest

0

変数を1つだけにしてみました。

java

1package teratail; 2 3public class NoSplit { 4 5 public static void main(String[] args) { 6 if (args.length == 0 || args[0].length() == 0) { 7 return; 8 } 9 10 for (char c : args[0].toCharArray()) { 11 if (c == '-') { 12 c = '\n'; 13 } 14 System.out.print(c); 15 } 16 System.out.println(); 17 } 18}

substring() を使おうとすると、start, end の2つの変数が必要になります。
String を char[] に分解して、一文字ずつ処理をするようにするなら変数は1つで済みます。

投稿2018/11/13 22:33

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問