LoginSignup
3
2

More than 5 years have passed since last update.

Java 融通がきかないStringクラスのsubstring

Posted at

JDK 1.8で書いています。

Stringクラスのsubstring

Stringクラスには、文字列の一部を切り出すsubstringメソッドがあります。引数の数に応じて2種類の切り出し方をしてくれます。

引数が1つの場合

定義

    substring(int beginIndex)

beginIndex以降の文字を切り出してくれる。文字列のインデックスは0から数えることに注意。

使用例

    String str = ("ドラえもん");
    String cutStr = str.substring(2);
    System.out.println("切り出し後:" + cutStr);

結果

    切り出し後:えもん

指定しているインデックス2にある文字以降の文字列が切り出される。

引数が2つの場合

定義

    substring(int beginIndex, int endIndex)

beginIndex以降の文字をendIndex-1の文字まで含めて切り出してくれる。
使用例

    String str = ("ドラえもん");
    String cutStr = str.substring(2, 4);
    System.out.println("切り出し後:" + cutStr);

結果

    切り出し後:えも

指定しているbeginIndex = 2にある文字以降から、endIndex - 1 = 3にある文字までの文字列えもが切り出される。

ここが微妙

引数が2つの場合、文字列がendIndex - 1に満たない長さの場合、例外が出ます。

ユースケース

画面表示する文字列を出力する。画面には4文字までしか表示できない制限があるため、出力する文字列を4文字までに絞りたい。もし4文字に満たない文字列であればそのまま出したい。

コード


    String str1 = ("ドラえもん");
    String str2 = ("のび太");
    String str3 = ("スネ夫");

    List<String> sourceStrList = Arrays.asList(str1, str2, str3);
    List<String> outStrList = new ArrayList<>();

    for (String sourceStr : sourceStrList) {
        outStrList.add(sourceStr.substring(0, 4));
    }

    System.out.println("切り出し後:" + outStrList);

結果

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4

はい、例外発生。ここではのび太スネ夫はインデックスが2までしかないので、endIndex - 1 = 3に満たないため、例外になるのです。
解消するには事前に文字の長さを調べる必要があるので面倒くさいですね~。

StringUtilssubstringを使って解決

org.apache.commons.lang3.StringUtilsに用意されているsubstringを使えば、この辺の気をきかして解決してくれます。

    substring(String str, int start, int end)

strに入れた切り出し対象の文字列のインデックスがstartからend - 1の文字列が出力されます。

コード

    String str1 = ("ドラえもん");
    String str2 = ("のび太");
    String str3 = ("スネ夫");

    List<String> sourceStrList = Arrays.asList(str1, str2, str3);
    List<String> outStrList = new ArrayList<>();

    for (String sourceStr : sourceStrList) {
        outStrList.add(StringUtils.substring(sourceStr, 0, 4));
    }

    System.out.println("切り出し後:" + outStrList);

結果

    切り出し後[ドラえも, のび太, スネ夫]

end - 1 = 3に満たない文字列も、そのまま出力してくれます。

参考

java.lang String substring
org.apache.commons.lang3 Class StringUtils substring

3
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2