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
に満たないため、例外になるのです。
解消するには事前に文字の長さを調べる必要があるので面倒くさいですね~。
StringUtils
のsubstring
を使って解決
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