java 分隔函数split(““,-1)的用途

一、思考的源头来历:阿里巴巴JAVA规范

【推荐】使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无内容的检查,
否则会有抛 IndexOutOfBoundsException 的风险。
说明:
String str = “a,b,c,”;
String[] ary = str.split(“,”);
// 预期大于 3,结果等于 3
System.out.println(ary.length);

二、代码解决方案
  1. 若干最后n位都是切割符,split(" “)不会继续切分,split(” ", -1)会继续切分
String line = "a|b||c|||||||";
    String [] tmp = line.split("\\|");
    System.out.println(tmp.length+"------");
    for(int i=0;i<tmp.length;i++){
        System.out.println(i+"="+tmp[i]);
    }
 
    String [] items = line.split("\\|",-1);
    System.out.println(items.length+"========");
    for(int i=0;i<items.length;i++){
        System.out.println(i+"="+items[i]);
    }

运行结果:
4------
0=a
1=b
2=
3=c
11========
0=a
1=b
2=
3=c
4=
5=
6=
7=
8=
9=
10=

  1. 如果字符串最后一位有值,则没有区别
String line = "a|b||c|||||||d";
    String [] tmp = line.split("\\|");
    System.out.println(tmp.length+"------");
    for(int i=0;i<tmp.length;i++){
        System.out.println(i+"="+tmp[i]);
    }
    String [] items = line.split("\\|",-1);
    System.out.println(items.length+"========");
    for(int i=0;i<items.length;i++){
        System.out.println(i+"="+items[i]);

运行结果
11------
0=a
1=b
2=
3=c
4=
5=
6=
7=
8=
9=
10=d
11========
0=a
1=b
2=
3=c
4=
5=
6=
7=
8=
9=
10=d

三、精简版解释

正常的数据格式A:
AAA|BBB|CCC|DDD|EEE
当最后一个栏位没有值时(并不代表该字段不存在,只是没有传值)的数据格式B:
AAA|BBB|CCC|DDD|

注意字符串末尾的差别,使用String.split(“|”)去分割该字符串时,A格式处理后返回的数组长度是5:[AAA,BBB,CCC,DDD,EEE];
而B格式处理后的结果是**[AAA,BBB,CCC,DDD],但是我想要的结果是[AAA,BBB,CCC,DDD,]**,最后一个栏位并不是不存在,只是为空值而已。

查看API文档后发现,直接使用String.split(“|”)时,内部其实调用的是split(“|”,0)方法。具体自行查看API文档。

解决办法:
使用String.split(“|”,-1)方法,传入-1的意思是尽可能多地分割字符串,包含末尾的空字符串。

四、个人观点

在实际项目中还是带上这个-1参数,减少不必要的麻烦

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值