こんにちは。「Javaを復習する初心者」です。
前回は文字列から任意の一文字を取り出すメソッドを復習しました。このメソッドを使うと文字列の一部分を取り出せそうですが、あらかじめそのようなメソッドが用意されています。String#substring()メソッドです。同じ名前のメソッドが2つ用意されていて、引数の数が違います。(オーバーロードという仕組みです。メソッドの名前が同じで引数が異なります。)今回は引数一つの方を使いました。
ソースと実行結果
substring(int index)メソッドは番号indexから最後まで取り出すメソッドです。また、length()メソッドは文字列の長さを取得するメソッド(前回、既に使ってましたが念のため。)です。以下にフローを書きます。
- 文字列strを”Hello_Wordld.”で初期化する。
- 繰り返しカウンタiが0からstr.length()以下まで、以下の処理を繰り返す。
- printfで”%2d:” + str.substring(i)を出力する。%2dはiを出力する。
- 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の引数は「文字列の長さ」を指定してもエラーは置きませんでした。。