Java splitPreserveAllTokens方法行为
test2有四个元素Java splitPreserveAllTokens方法行为,java,Java,test2有四个元素 [你好,l,世界] 有两个空元素。 Test1有3个 [你好,l,世界] 这是预期的行为 根据splitPreserveAllTokens的javadoc,以下是合乎逻辑的 String string = "Hello,,l,, World"; String test1[] = string.split(",,"); String test2[] = StringUtils.splitPreserveAllToken
[你好,l,世界]
[你好,l,世界]
splitPreserveAllTokens
的javadoc,以下是合乎逻辑的
String string = "Hello,,l,, World";
String test1[] = string.split(",,");
String test2[] = StringUtils.splitPreserveAllTokens(string , ",,");
但我仍然不清楚test2的输出。
请解释test2的其他空元素。在文档中:
相邻的分隔符被视为空令牌的分隔符
及
separatorChars-用作分隔符的字符,空格上的null分隔符
这意味着,如果使用“,”或“,”作为第二个参数,则不会有任何区别
结合第一个引号和示例,我假设字符串的开头和结尾都被视为分隔符:
StringUtils.splitPreserveAllTokens(“:cd:ef:”,“:”)
开头和第一个冒号之间有一个(空)标记,第一个冒号和第二个冒号(“cd”)之间有一个标记,第二个冒号和第三个冒号(“ef”)之间有一个标记,最后一个冒号和导致文档显示结果的字符串结尾之间有一个(同样为空):[“”,“cd”,“ef”,“”]
(拼写正确)
在您的情况下,上面的第二个报价更相关。“,”不作为分隔符处理,而是作为一组分隔符处理。在这种情况下,意思是“,”相当于“,”。然后在第一句话之后,你可以解释你得到的结果:字符串开头到第一个
,
:“Hello”第一个逗号到第二个逗号:“
第二个逗号到第三个:“l”
第三到第四个:“
第四段到最后一段:“世界” 输出:
String string = "Hello$l$ World";
String test1[] = string.split("$$");
String test2[] = StringUtils.splitPreserveAllTokens(string , "$$");
以下是splitPreserveAllTokens的代码
Test2 [Hello, l, World]
Test1 [Hello$l$ World]
//标准案例
而(我=0){
如果(匹配| |保留所有标记){
lastMatch=true;
如果(sizePlus1++==最大值){
i=len;
lastMatch=false;
}
添加(str.substring(start,i));
匹配=假;
}
开始=++i;
继续;
}
lastMatch=false;
匹配=真;
i++;
}
}
这意味着分隔符字符将被视为一组单独的分隔符字符。只要在主字符串上找到任何分隔符,它就会被拆分
与通常的拆分相比,使用此方法的优势是
splitPreserveAllTokens方法隐式处理null
正如这里提到的
在StringUtils中,它使用splitWorker(String str、char separatorChar、boolean preserveAllTokens),它自己的方法是2.0(JDK1.4)的性能调优。
你可以看看源代码,它可能会解释一些事情:是的,它解释了它将字符串按sperator的每个字符分割。但对我来说还是没有意义
Test2 [Hello, l, World]
Test1 [Hello$l$ World]
// standard case
while (i < len) {
if (separatorChars.indexOf(str.charAt(i)) >= 0) {
if (match || preserveAllTokens) {
lastMatch = true;
if (sizePlus1++ == max) {
i = len;
lastMatch = false;
}
list.add(str.substring(start, i));
match = false;
}
start = ++i;
continue;
}
lastMatch = false;
match = true;
i++;
}
}