プログラマメモ2 - programmer no memo2

java splitとStringTokenizerと... 2007/07/25
2007/08/03

年に一度は何故かはまるjavaの文字列の切り分け。
単純にStringのsplitを使ってはじめはよろこんで、何か、思い通りにいかず、StringTokenizerを使っても、思い通りにいかず、最後に実装をjakarta コモンズにたよってしまったというパターン。

カンマ区切りでためしてみました。

シナリオ:

カンマ区切りを行いたい。値がない区切りデータも受け取りたい。


ターゲットの文字列は、
aa,,bb,,,,

結果
StringTokenizer
[aa]
[bb]
-------------
split
[aa]
[]
[bb]
-------------
commons StringUtils splitPreserveAllTokens
[aa]
[]
[bb]
[]
[]
[]
[]
-------------
using indexof substrin
[aa]
[]
[bb]
[]
[]
[]




使用したソースです。
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.commons.lang.StringUtils;

public class TestTokenizer {

public static void main(String[] args) {
String s = "aa,,bb,,,,";
System.out.println("StringTokenizer");
a(s);
System.out.println("-------------");
System.out.println("split");
b(s);
System.out.println("-------------");
System.out.println("commons StringUtils splitPreserveAllTokens");
c(s);
System.out.println("-------------");
System.out.println("using indexof substring ");
d(s);
}

/**
* 途中の値が入っていない値、お尻がとれない。
*
* @param s
*/
public static void a(String s) {
StringTokenizer tokenizer = new StringTokenizer(s, ",");
while (tokenizer.hasMoreTokens()) {
System.out.println("[" + tokenizer.nextToken() + "]");
}
}

/**
* お尻がとれない。
*
* @param s
*/
public static void b(String s) {
String[] strings = s.split(",");
for (String string : strings) {
System.out.println("[" + string + "]");
}
}

/**
* この値の取得が求めていたもの。
*
* @param s
*/
public static void c(String s) {
String[] strings = StringUtils.splitPreserveAllTokens(s, ",");
for (String string : strings) {
System.out.println("[" + string + "]");
}
}

/**
* この実装はたまたまみつけたもの。この実装だとお尻がとれない。
*
* @param s
*/
public static void d(String s) {
String delim = ",";
List<String> list = new ArrayList<String>();

int delimCharIndex = 0;
while (s.length() != 0) {
delimCharIndex = s.indexOf(delim);
if (delimCharIndex == -1) {
list.add(s);
s = "";
} else {
String subString = s.substring(0, delimCharIndex);
list.add(subString);
s = s.substring(delimCharIndex + 1);
}
}

for (String string : list) {
System.out.println("[" + string + "]");
}
}
}



20070803 H氏からコメントをいただいたので掲載

String[] strings = s.split(",");



String[] strings = s.split(",", -1);

とすれば「カンマ区切りを行いたい。値がない区切りデータも受け取りたい。」ができます。


あっなるほど。

: