java split(转)

一道腾讯java笔试题

试题如下:

"|DF|A".split("|").length的结果是()

A 2 B 3 C 5 D 6

我知道String的split方法极容易出错,然而想不到的是这道题的答案竟然是D.

分析:

这道题的关键是String.split方法的参数是一个正则表达式字符串,split实际上调用的是:

[code]
public String[] split(String regex, int limit) {
return Pattern.compile(regex).split(this, limit);
}
[/code]

而"|"这里不是简单的'|'字符,查阅Pattern类API就会知道:

"|"是正则表达式里的逻辑或运算符,它被编译后匹配的是其左右两边的任意一个字符串.举个例子来说

[code]
String[] arr = "a1b2cc1dd".split("1|2");//以1或者2分隔字符串

System.out.println(arr.length);
for(String s:arr){
System.out.println(s);
}


结果:
4
a
b
cc
dd


//以空串或者空串分隔字符串,实际上是分隔每一个字符


String[] arr = "a1b2cc1dd".split("|");

System.out.println(arr.length);
for(String s:arr){
System.out.println(s);
}


结果:
10
a
1
b
2
c
c
1
d
d

[/code]


这道题到这里已经知道为什么要选择D了,但对于String.split方法我觉得更容易出问题的还在以下一些例子,请读者自己查看源码查找答案:

"|DF|A|||".split("[|]").length = 3

"||DF|A|||".split("[|]").length = 4


//关键看Pattern类源码


public String[] split(CharSequence input, int limit) {
int index = 0;
boolean matchLimited = limit > 0;
ArrayList matchList = new ArrayList();
Matcher m = matcher(input);
// Add segments before each match found
while(m.find()) {
if (!matchLimited || matchList.size() < limit - 1) {
String match = input.subSequence(index, m.start()).toString();
matchList.add(match);
index = m.end();
} else if (matchList.size() == limit - 1) { // last one
String match = input.subSequence(index,
input.length()).toString();
matchList.add(match);
index = m.end();
}
}
// If no match was found, return this
if (index == 0)
return new String[] {input.toString()};
// Add remaining segment
if (!matchLimited || matchList.size() < limit)
matchList.add(input.subSequence(index, input.length()).toString());
// Construct result
int resultSize = matchList.size();
if (limit == 0)


//请看这里做了什么操作,分隔后的结果从最后开始遍历,凡是等于空串的一律截掉,否则退出
while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
resultSize--;
String[] result = new String[resultSize];
return (String[])matchList.subList(0, resultSize).toArray(result);
}




转自http://yu.an.jin.5.blog.163.com/blog/static/53155811201099115435386/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值