A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蒋昌宏 黑马帝   /  2012-2-14 01:09  /  2564 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 蒋昌宏 于 2012-2-16 19:19 编辑

public class StringAPIDemo07{
        public static void main(String args[]){
                String str = "        hello world        " ;//前面8个空格,后面也是8个空格
                System.out.println(str.length()) ;
                String s[] = str.split(" ",27) ;        // 按照空格拆分,如果不写角标位的话,实际结果就没有处理后面那8个空格了。
                for(String st:s){
                        System.out.print(st+"*") ;
                }
        }
};



求解为啥String s[] = str.split(" ") ;的话,只处理前面8个空格,必须写上全部字符数量才能把后面8个空格也处理了,不写角标位的话是按什么来划分的?

评分

参与人数 1技术分 +1 收起 理由
技术测试刘老师 + 1 不错!

查看全部评分

4 个回复

倒序浏览
你好!

你的这个 String str = "        hello world        " ;长度你得到的是27.没有问题。
String s[] = str.split(" ",27) ;    你要清楚你的这行代码在做什么?
是让str字符串按照正则表达式的规则切分27次。  你的正则表达式规则是按照一个空字符切分,并且切分27次。
而你最后得到的长度是18,这个长度是切换后的String数组的长度,本来最多就能切分18次,你非要指定切分27次,剩下的9次怎么切,你切分18次以后切完了,剩下的9次程序不知道怎么切了,所以就丢掉了9次的空字符规则,最终切分的数组长度是18.

你要明白切分后是String[]数组的长度,不是再回去按你的str字符串的长度计算切分的数组长度。
比如你家人给做饭吃,给你10个馒头吃,你才吃了8个,剩下两个自然就浪费了。你要计算是你已经吃了几个馒头,而不是在你没吃之前你家人给你几个馒头。

回复 使用道具 举报
本帖最后由 黄秋 于 2012-2-14 06:24 编辑

LS的说得具体仔细,却没揣摩一下LZ的心思:
String s[] = str.split(" ",27) ;        // 按照空格拆分,如果不写角标位的话,实际结果就没有处理后面那8个空格了

LZ的str.split(" ",27) ,估计是受了substring的影响,因substring 里的 int 参数是字符串索引来的,它以为split 也是,split(" ",27)想象成处理到索引27(或长度27)。

其实遇到问题,先查API --- split(String regex, int limit),刚巧有例子:
limit 参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。如果 n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。

例如,字符串 "boo:and:foo" 使用这些参数可生成以下结果:

Regex Limit 结果
: 2 { "boo", "and:foo" }
: 5 { "boo", "and", "foo" }
: -2 { "boo", "and", "foo" }
o 5 { "b", "", ":and:f", "", "" }
o -2 { "b", "", ":and:f", "", "" }
o 0 { "b", "", ":and:f" }

API的说明,要费些神看。limit,split里的 int 参数,那个整数其实就是切割的份数: 2 { "boo", "and:foo" } 就分了两份,: 5 { "boo", "and", "foo" } 想要5份,但最多3份,就分了3份,还有,o 0 { "b", "", ":and:f" } 会“结尾空字符串将被丢弃”。显然,split(" ",27)就是想分27份,如不够27,分完也算了。那么, “不写角标位的话是按什么来划分的?”,查API --- split(String regex)
该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括结尾空字符串。

例如,字符串 "boo:and:foo" 使用这些表达式可生成以下结果:

Regex 结果
: { "boo", "and", "foo" }
o { "b", "", ":and:f" }

可见,str.split(" ") 相当于 str.split(" ",0) ,这个0不是分0份啊,0份那还分来干吗?是“ n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。 ”
为啥String s[] = str.split(" ") ;的话,只处理前面8个空格 --- 后面的空格,也处理了,但因是空格,丢弃了,故看不到。
回复 使用道具 举报

回帖奖励 +1

本帖最后由 杨扬 于 2012-2-14 10:02 编辑

String s[] = str.split(" ") ;,只处理前面8个空格
     是应为它相当于 str.split(" ",0);  当后面参数为0的时候,该模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃.
其实LZ不需要去数长度,后面限制参数为负数就可以了.String s[] = str.split(" ",-1) ;

回复 使用道具 举报
看文档 split(" ",0)和split(" ")效果是一样的具体的区别,文档说的很清楚
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马