日期:2014-05-20  浏览次数:20560 次

问个简单又纠结的string.split问题
String sour = "1##f####43####43######";
System.out.println(sour.split("##").length);

打印结果是6,后面两个空串被无视了,
可是我想要的结果是8才对,请各位高人指点,如何才能获取正确结果

------解决方案--------------------
哦,楼主啊,带个参数就好了:

sour.split("##", -1);
------解决方案--------------------
去看一下JDK上对split方法的叙述吧。

有另一个带两个参数的split方法
public String[] split(String regex, int limit)
第二个参数的是限制匹配次数的,设为非正数会无限制的尽可能匹配,如果是0的话则还会将最后的空串去掉。而带一个参数的方法实际上就是调用了第二个参数为0的方法。

所以,你调用sour.split("##", -1).length可以得到9的结果,因为实际上切了8次,分为9段,最后还有一个空串。如果你一定要等于8的结果的话,就再减1吧。
------解决方案--------------------
import java.util.List;
import java.util.ArrayList;


public class Test{

public static void main(String []args){
 
/**
String sour = "1,f,,43,,43,,";
String []arr = sour.split(",") ;
System.out.println(arr.length);

for (int i = 0; i < arr.length; i++){
System.out.println(i+1 + " = " + arr[i]) ;
}
*/
String sour = "1##f####43####43######";

List<String> list = new ArrayList<String>() ;

String tmp = sour;
String content ;
int idx = 0 ;
while(!"".equals(tmp)){
idx = tmp.indexOf("##") ;
list.add(tmp.substring(0 , idx)) ;
System.out.println(list.size() + "、" + list.get(list.size()-1)) ;
tmp = tmp.substring(idx+2) ;

}
System.out.println("===" + list.size() ) ;



}
}


结果:

E:\>java Test
1、1
2、f
3、
4、43
5、
6、43
7、
8、
===8
------解决方案--------------------
那是底层调用的代码,在输出结果集的时候进行了判断,把空字符串给过滤掉了。红色字体部分