- StringTokenizer
- String.split()
- org.apache.commons.lang3.StringUtils.split()
- org.apache.commons.lang3.StringUtils.splitPreserveAllTokens()
- com.google.common.base.Splitter
- org.apache.commons.text.StringTokenizer
- まとめ
StringTokenizer
StringTokenizer は、Tokenizer というトークン化の目的の通り、空項目があると無視される。
StringTokenizer st = new StringTokenizer("a,,b,c", ","); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); }
以下の通り。
a b c
String.split()
StringTokenizer とは異なり、空項目は空白として扱われる。
String[] result = "a,,b,c".split(","); Arrays.stream(result).forEach(System.out::println);
以下の通り。
a b c
なので、StringTokenizer を String.split() に単純置き換えすることができない。
ちなみに String.split() が厄介な点は、空項目が空白として扱われないケースがある点。
以下は予想に反して長さゼロの配列を返す。
String[] result = ",,,".split(","); System.out.println(result.length); // 0
どこかに項目があれば
result = ",,c,".split(","); Arrays.stream(result).forEach(System.out::println);
以下のようになる。
c
そしてこれは、末尾の空項目は捨てられた結果となる。
org.apache.commons.lang3.StringUtils.split()
一方、StringUtils.split() は空項目が無視される。
Arrays.stream(StringUtils.split("a,,b,c", ",")) .forEach(System.out::println);
以下の通り。
a b c
org.apache.commons.lang3.StringUtils.splitPreserveAllTokens()
空項目を扱う用途では、splitPreserveAllTokens() が用意されている。
Arrays.stream(StringUtils.splitPreserveAllTokens("a,,b,c", ",")).forEach(System.out::println);
以下の通り。
a b c
com.google.common.base.Splitter
Splitter のデフォルトは、String.split() と同様に空項目が扱われる。
Splitter.on(',').split("a,,b,c").forEach(System.out::println);
以下の通り。
a b c
omitEmptyStrings() で空項目を無視できる。
Splitter.on(',').omitEmptyStrings().split("a,,b,c").forEach(System.out::println);
以下の通り。
a b c
org.apache.commons.text.StringTokenizer
Commons Text の StringTokenizer はデフォルトで空項目が無視される。
StringTokenizer st = new StringTokenizer("a,,b,c", ","); st.getTokenList().forEach(System.out::println);
以下の通り。
a b c
setIgnoreEmptyTokens(false) で空項目を扱うように変更できる。
StringTokenizer st = new StringTokenizer("a,,b,c", ","); st.setIgnoreEmptyTokens(false); st.getTokenList().forEach(System.out::println);
以下の通り。
a b c
まとめ
分かりにくさの原因は、StringUtils.split() が空項目を無視する仕様になっているためであろう。
それ以外は以下のように統一されている。
- Tokenizer 系は、字句分割の意味で、空項目は無視される
- Sprit 系は、分割を意味するために空項目は空項目として扱う