【发布时间】:2014-10-19 11:08:22
【问题描述】:
我有一个字符串,看起来像 - 56,0,76,0,93,,,,,,,1230。 我使用 StringTokenizer 将其拆分为“,”。但是,这似乎是从 93 直接跳到 1230。有没有办法让它在移动到 1230 之前返回六个空字符串?
【问题讨论】:
-
你检查过 java.util.Scanner 吗?
标签: java stringtokenizer
我有一个字符串,看起来像 - 56,0,76,0,93,,,,,,,1230。 我使用 StringTokenizer 将其拆分为“,”。但是,这似乎是从 93 直接跳到 1230。有没有办法让它在移动到 1230 之前返回六个空字符串?
【问题讨论】:
标签: java stringtokenizer
使用StringTokenizer(String str, String delim, boolean returnDelims) 并将returnDelims 设置为true
如果 returnDelims 标志为真,则分隔符也作为标记返回。每个分隔符都作为长度为 1 的字符串返回。
【讨论】:
改用String.split() 方法。
String str = "56,0,76,0,93,,,,,,,1230";
String[] stringArr = str.split(",");
这将返回一个字符串数组。
【讨论】:
,,-56,0,76,0,93,,,,,,,1230,
String.split(",",-1); 如果没有 -1,它将忽略尾随分隔符
【讨论】:
将String#split(regex,limit) 与limit 一起用作-1
示例代码:
System.out.println(Arrays.toString(",,-56,0,76,0,93,,,,,,,1230,".split(",",-1)));
输出:
[, , -56, 0, 76, 0, 93, , , , , , , 1230, ]
【讨论】:
StringTokenizer 有一个构造函数,它接受 3 个参数,第三个参数是一个布尔值,用于控制分隔符是否作为标记返回。您应该将其设置为 true。
new StringTokenizer(yourString, yourDelimiters, true);
现在分隔符也返回了,通过检查两个连续的标记是否为分隔符,很容易判断是否存在空字符串。
您可以扩展分词器或编写自己的包装类以进行重用。
【讨论】:
使用 Google 的 Guava 库 Splitter
String str = "56,0,76,0,93,,,,,,,1230";
Iterable<String> splitResult = Splitter.on(",").split(str);
并转换为ArrayList
ArrayList<String> elementList = Lists.newArrayList(splitResult);
elementList.size(); // 12
【讨论】:
请找一份工作副本来克服 Empty Token
public class TestStringTokenStrict {
/**
* Strict implementation of StringTokenizer
*
* @param str
* @param delim
* @param strict
* true = include NULL Token
* @return
*/
static StringTokenizer getStringTokenizerStrict(String str, String delim, boolean strict) {
StringTokenizer st = new StringTokenizer(str, delim, strict);
StringBuffer sb = new StringBuffer();
while (st.hasMoreTokens()) {
String s = st.nextToken();
if (s.equals(delim)) {
sb.append(" ").append(delim);
} else {
sb.append(s).append(delim);
if (st.hasMoreTokens())
st.nextToken();
}
}
return (new StringTokenizer(sb.toString(), delim));
}
static void altStringTokenizer(StringTokenizer st) {
while (st.hasMoreTokens()) {
String type = st.nextToken();
String one = st.nextToken();
String two = st.nextToken();
String three = st.nextToken();
String four = st.nextToken();
String five = st.nextToken();
System.out.println(
"[" + type + "] [" + one + "] [" + two + "] [" + three + "] [" + four + "] [" + five + "]");
}
}
public static void main(String[] args) {
String input = "Record|One||Three||Five";
altStringTokenizer(getStringTokenizerStrict(input, "|", true));
}}
输出将是
[Record] [One] [ ] [Three] [ ] [Five]
【讨论】: