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

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

ただいまの
回答率

88.57%

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

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 454

orangeLover

score 11

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

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

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

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

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

package nosplit;

public class NoSplit {

    public static void main(String[] args) {

        int index = 0;

        int index2 = 0;

        String word = args[0];

        while (true) {

            index2 = word.indexOf("-", index);

            if(!(-1 == index2)){

                System.out.println(word.substring(index,index2));

                index = index2 + 1;

            } else {

                index = word.lastIndexOf("-");

                System.out.println(word.substring(index + 1));

                break;
            }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2018/11/12 10:34

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

    キャンセル

回答 4

+3

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

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

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

static String[] mySplit(String src, String delimiter) {
     String[] ret = new String[src内のdelimiterの個数 + 1];
     ...

     return ret;
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

package nosplit;

public class NoSplit {

    public static void main(String[] args) {

        int index = 0;

        String word = args[0];

        while ((index = word.indexOf("-")) >= 0) {

            System.out.println(word.substring(0, index));

            word = word.substring(index + 1);

        }

        System.out.println(word)
    }
}


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/12 11:38

    迅速なご回答、ありがとうございます。
    なるほど...ケースバイケース、ということなのでしょうか?

    >Stringの生成回数
    これは
    String something = "";
    のことでしょうか?

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

package teratail;

public class NoSplit {

    public static void main(String[] args) {
        if (args.length == 0 || args[0].length() == 0) {
            return;
        }

        for (char c : args[0].toCharArray()) {
            if (c == '-') {
                c = '\n';
            }
            System.out.print(c);
        }
        System.out.println();
    }
}

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.57%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る