java splitとStringTokenizerと...
2007/07/25
2007/08/03
commons
java
年に一度は何故かはまる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 + "]");
}
}
}
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);
とすれば「カンマ区切りを行いたい。値がない区切りデータも受け取りたい。」ができます。
あっなるほど。
: