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

2018年4月6日String

スポンサーリンク

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

スポンサーリンク

プログラム

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

  1. 文字列変数strを”Hello_ABCDE.”で初期化する。
  2. 文字列変数strを改行付きで出力する。
  3. 繰り返しカウンタiが0からstr.length()以下まで、以下の処理を繰り返す。
    1. 改行付きで出力:”%2d:” + str.substring(i);ここで、%2dはiを埋める。

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

package test;

public class HelloSubstringBegin {

    public static void main(String[] args) {

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

    }

}
Hello_ABCDEF.
 0:Hello_ABCDEF.
 1:ello_ABCDEF.
 2:llo_ABCDEF.
 3:lo_ABCDEF.
 4:o_ABCDEF.
 5:_ABCDEF.
 6:ABCDEF.
 7:BCDEF.
 8:CDEF.
 9:DEF.
10:EF.
11:F.
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なのでした。

スポンサーリンク

おすすめQAサイト

エンジニア特化型Q&Aサイト【teratail(テラテイル)】:
このサイトはプログラミング特化型のQAサイトです。ソースを見やすく整形させた状態で表示させることが出来ます。