コース一覧
    Java中級:文字列・日付・標準ライブラリ
    split と join

    Java中級:文字列・日付・標準ライブラリ

    文字列・日付・時刻と標準ライブラリを学び、よく使うデータ加工や日時処理を適切に実装できるようにします。

    1
    文字列操作
    01. String.format で書式化5分
    02. StringBuilder で連結5分
    03. 正規表現の基本5分
    04. split と join5分
    05. 文字列操作 まとめクイズ5分
    2
    日付と時刻
    01. LocalDate で日付を扱う5分
    02. LocalDateTime で時刻も扱う5分
    03. Duration で時間差を計算5分
    04. 日付の書式化とパース5分
    05. 日付の加減算5分
    06. 日付と時刻 まとめクイズ5分

    split と join

    CSV の列ズレ

    split(".") が、なぜか空の配列を返す

    外から渡ってくるデータの多くは、カンマ区切りやスラッシュ区切りといった「区切り文字でつながった 1 本の文字列」です。これをばらすのが String.split、ばらしたものを 1 本に戻すのが String.join です。

    ところが、ファイル名を拡張子で分けようとした最初の 1 行でつまずきます。

    Java

    String path = "app.config.json";
    
    String[] bad = path.split(".");
    System.out.println(bad.length);    // 0
    
    String[] good = path.split("\\.");
    System.out.println(good.length);   // 3

    例外は出ません。長さ 0 の配列が黙って返ってきて、後ろの処理が空回りするだけです。

    区切り文字は、正規表現として読まれている

    split の引数は、ただの文字ではなく 正規表現 として解釈されます。正規表現の . は「任意の 1 文字」なので、split(".") は「どの文字も区切り文字」という意味になります。全部が区切りなので、残る中身が 1 つもなく、結果は空の配列です。

    文字としてのドットで分けたいなら、\\. と書いて打ち消します。同じことが | ? * + ( ) [ ] { } ^ $ にも当てはまります。

    Java

    String[] parts = "red|green|blue".split("\\|");
    System.out.println(String.join(" / ", parts));   // red / green / blue

    打ち消しが面倒なときは Pattern.quote("|") を通すと、中身を文字どおりに扱ってくれます。なお , や - は正規表現でも特別な意味を持たないので、そのまま渡して構いません。

    String.join の方に正規表現の話はありません。第 1 引数の文字列を、要素と要素の間にそのまま挟むだけです。配列でも List でも受け取れて、末尾に余計な区切りが残らないので、自分でループを回して最後の 1 文字を削るような処理は要りません。同じ道具に見えて片方だけ正規表現、というのが混乱しやすいところです。

    空の入力と、末尾の空白は数え方が違う

    もう 1 つ、split の戻り値には直感に反する決まりが 2 つあります。

    Java

    System.out.println("".split(",").length);      // 1
    System.out.println("a,b,,".split(",").length); // 2

    空文字列を分けると、空配列ではなく空文字列 1 個が入った配列が返ります。そして末尾に続く空の要素は捨てられるので、"a,b,," は 4 要素ではなく 2 要素になります。列数を厳密に揃えたい場面では split(",", -1) と第 2 引数に負の数を渡すと、末尾の空要素も残ります。

    解説

    区切り文字の周りに空白が混ざった入力はよくあります。split した直後に各要素を trim しておくと、雑な入力でも安定します。

    課題では、カンマで分けて中身を並べ替え、またカンマでつなぎ直します。カンマは打ち消しの要らない文字なのでそこは素直に書けますが、空文字列を渡されたときに何が返るかは、上の決まりを思い出して先に確かめておいてください。

    要件

    1. csv.split(",") を使って文字列を , で分割すること
    2. 分割した配列を逆順に並べ替えてから String.join(",", ...) でつなぎ直すこと
    3. csv が空文字列 "" のときは空文字列をそのまま返すこと

    ヒント

    `String.split` の戻り値は `String[]` です。`for` ループで `i = parts.length - 1` から `0` に向かって回せば逆順に詰め直せます

    `String.join` は第 1 引数に区切り文字、第 2 引数に配列または `List` を取ります。`String.join(",", reversed)` のように呼び出します

    空文字列を `split` すると要素 1 個の配列 `[""]` が返るので、最初に `csv.isEmpty()` で分岐して空文字列を返すのが安全です

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

    関連レッスン

    • 文字列操作 まとめクイズ

      中級「文字列操作」章で学んだ `String.format` / `StringBuilder` / 正規表現 / `split` / `join` の使い分けを 4 択で総ざらいする章末まとめ。

    • LocalDate で日付を扱う

      Java 8 で導入された java.time.LocalDate を使って、日付の生成・加減算・整形を学び、年月日から ISO 形式の文字列を返すコードを書いてみよう。

    • 正規表現の基本

      Java の正規表現の基本パターンとメタ文字のエスケープを学び、String.matches を使って簡易なメール形式かを判定する関数を書いてみよう。

    • StringBuilder で連結

      Java の `String` は immutable で `+` 連結はループ内で性能が落ちるため、可変な文字列ビルダー `StringBuilder` を使って効率良く文字列を組み立てる方法を学ぶ。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 配列サイズ固定の同型データの集まり
    • 処理計算や代入を表す長方形
    • 引数位置引数=順番で渡す。
    • ループ繰り返し処理。矢印で戻すか専用記号で示す
    • 戻り値呼び出し元への返答を表す点線矢印
    main.java
    エディタを読み込んでいます

    メモ

    split と join

    ⌘S で保存