こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

文字列の途中から最後まで取り出す

こんにちは。「Javaを復習する初心者」です。前回は文字列から任意の一文字を取り出すメソッドを復習しました。このメソッドを使うと文字列の一部分を取り出せそうですが、あらかじめそのようなメソッドが用意されています。String#substringメソッドです。同じ名前のメソッドが2つ用意されていて、引数の数が違います。(オーバーロードという仕組みです。メソッドの名前が同じで引数が異なります。)今回は引数一つの方を使いました。

プログラム

substring(int index)メソッドは番号indexから最後まで取り出すメソッドです。また、length()メソッドは文字列の長さを取得するメソッド(前回、既に使ってましたが念のため。)です。以下にフローを書きます。

  1. 文字列strを”Hello_Wordld.”で初期化する。
  2. 繰り返しカウンタiが0からstr.length()以下まで、以下の処理を繰り返す。
    1. printfで”%2d:” + str.substring(i)を出力する。%2dはiを出力する。
    2. println()を出力する。

さて、i=str.length()の場合、エラーが出るのでしょうか。以下はソースと実行結果です。

package stringTest;

public class HelloSubstringBegin {

    public static void main(String[] args) {

        String str = "Hello_Wordld.";

        for (int i = 0; i <= str.length(); i++) {
            System.out.printf("%2d:" + str.substring(i), i);
            System.out.println();
        }

    }

}
 0:Hello_Wordld.
 1:ello_Wordld.
 2:llo_Wordld.
 3:lo_Wordld.
 4:o_Wordld.
 5:_Wordld.
 6:Wordld.
 7:ordld.
 8:rdld.
 9:dld.
10:ld.
11:d.
12:.
13:

という結果になりました。

解説

出力ではprintfを使ってますが、これは第一引数に書式を渡すメソッドです。詳細は省略しますが今回の使いかたでは%2dの箇所に第二引数の数値が2ケタで出力(ケタ不足の場合は空白埋め)されます。

stringは内部にchar型配列で文字列を保存し、そのindexがそのままsubstringの引数です。なのでiが12までは納得いく結果だと思います。i=0の場合、文字列の先頭から最後まで出力されます。文字列の長さは13なのでi=12がちょうど配列の最後の要素番号です。なのでi=12の場合、最後の一文字が出力されます。最後のi=13のとき、何が出力されているのかというと、空文字です。以下のプログラムで確認しました。

package stringTest;

public class HelloSubstringBeginEmpty {

    public static void main(String[] args) {

        String str = "Hello_Wordld.";

        if (str.substring(str.length()).isEmpty()) {
            System.out.println("empty");
        }

    }

}
empty

if文の条件が満たされ、文字列「empty」が出力されました。isEmptyメソッドは内部で何をやっているかというと、文字列の長さが0であるかどうかを判定してその真偽値を返しています。長さ0ならばtrueが返却されます。とにかく、substringの引数は文字列の長さもOKなのでした。