黑马程序员技术交流社区

标题: 关于String 字符串练习的疑问 [打印本页]

作者: 郭利超    时间: 2013-3-18 21:52
标题: 关于String 字符串练习的疑问
本帖最后由 郭利超 于 2013-3-18 22:47 编辑
  1. /*
  2. 3,获取一个字符串在另一个字符串中出现的次数。
  3. "abkkcdkkefkkskk"


  4. 思路:
  5. 1,定义个计数器。
  6. 2,获取kk第一次出现的位置。
  7. 3,从第一次出现位置后剩余的字符串中继续获取kk出现的位置。
  8. 每获取一次就计数一次。
  9. 4,当获取不到时,计数完成。



  10. */

  11. class StringTest2
  12. {

  13. /*
  14. 练习三。

  15. */

  16. public static int getSubCount(String str,String key)
  17. {
  18. int count = 0;
  19. int index = 0;

  20. while((index=str.indexOf(key))!=-1)
  21. {
  22. sop("str="+str);
  23. str = str.substring(index+key.length());

  24. count++;
  25. }
  26. return count;
  27. }

  28. /*
  29. 练习三,方式二。

  30. */
  31. public static int getSubCount_2(String str,String key)
  32. {
  33. int count = 0;
  34. int index = 0;

  35. while((index= str.indexOf(key,index))!=-1)
  36. {
  37. sop("index="+index);
  38. index = index + key.length();

  39. count++;
  40. }
  41. return count;
  42. }

  43. public static void main(String[] args)
  44. {
  45. String str = "kkabkkcdkkefkks";

  46. ///sop("count====="+str.split("kk").length);不建议使用。

  47. sop("count="+getSubCount_2(str,"kk"));
  48. }

  49. public static void sop(String str)
  50. {
  51. System.out.println(str);
  52. }
  53. }
复制代码
以上代码中 关于下面几句话没有理解好 请大神详细解释
while((index=str.indexOf(key))!=-1)    该怎么理解 为什么不等于-1

str = str.substring(index+key.length());    什么含义 听了 看了 没懂

sop("count====="+str.split("kk").length);不建议使用。      说不能通用  我也看到视频结果出现了错误 但还是没有理解 请大神详细解释 什么时候出现错误


作者: 李尧    时间: 2013-3-18 22:20
1. public int indexOf(String str)如果字符串参数作为一个子字符串在此对象中出现,则返回第一个这种子字符串的第一个字符的索引;如果它不作为一个子字符串出现,则返回 -1。
那么对应你的代码,当返回值为-1时 也就说在目标字符串中 根本就没有key这个字符串.所以while循环结束.
2.substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾。
用你的例子:
"abkkcdkkefkkskk" 获取 得到kk第一次出现的index后 从index+"kk".length() 的位置一直到原字符串末尾 获取子串.也就是"cdkkefkkskk";
用while循环重复这个获取的过程 直到返回值为-1,也就是不再有"kk"出现,最终得到的count就是"kk"出现的次数了.
3.如果你的字符串是"kkabkkcdkkefkks" 用str.split("kk").length得到的结果是出现了5次 而实际上"kk"只出现了4次.
为什么呢?因为这样截取的数组是 [,ab,cd,ef,s] .也就是说 当"kk"出现在字符串的开头 这种方法是不适用的 所以不推荐.

作者: 黑马17期-闫东东    时间: 2013-3-18 22:27
int indexOf(String str)返回str 在字符串中第一次出现的位置,如果不存在返回-1,
index=str.indexOf(key))!=-1  就是用来获取kk出现的位置,不等于-1 继续循环来找。
str = str.substring(index+key.length());    从找到kk的位置之后的字符串再去找kk,
public static int get(String str,String key){
        int count=0;
        int index=0;
        while((index= str.indexOf(key))!=-1){
                str=str.substring(index+key.length());
                System.out.println("str="+str);
                  
                count++;
               
        }
        return count;
       
}
打印:
str=abkkcdkkefkks
str=cdkkefkks
str=efkks
str=s
count=4
上面的通过截取字串,
下面这个改变index,
        public static int get2(String str,String key){
                int count=0;
                int index=0;
                while((index=str.indexOf(key))!=-1){
                        index=index+key.length();
                        count++;
                }
                return count ;
        }


sop("count====="+str.split("kk").length);这个如果key出现在头位置,截出个空字符串,多计算一次。

作者: 飞天小猪猪    时间: 2013-3-18 22:29
while((index=str.indexOf(key))!=-1)    是因为在indexOf方法中如果字符串中没有key这个值时就返回-1,如果不等于-1,这例子中就表示字符串中海油kk数据,然后在进行下面的代码。

str = str.substring(index+key.length());    在该方法中是substring方法返回了从index角标加上kk的长度2的和为新角标为起始角标后的所有字符串,即返回了一个新的子字符串,也就是kk后面的字符串

sop("count====="+str.split("kk").length);不建议使用。是因为假如这个字符串首字符就是kk的话 那么切割出来的就是一个空字符串和kk后面的一部分,所以返回结果就会错误。比如说kkagsdkksdfkks 如果用split切割后count数是4 而该例子的count应该是用kk分割了3次

作者: 郭利超    时间: 2013-3-18 22:46
李尧 发表于 2013-3-18 22:20
1. public int indexOf(String str)如果字符串参数作为一个子字符串在此对象中出现,则返回第一个这种子字 ...

嗯 理解了 TKS
作者: 郭利超    时间: 2013-3-18 22:46
黑马17期-闫东东 发表于 2013-3-18 22:27
int indexOf(String str)返回str 在字符串中第一次出现的位置,如果不存在返回-1,
index=str.indexOf(ke ...

嗯 理解了 TKS
作者: 郭利超    时间: 2013-3-18 22:46
HM朱俊 发表于 2013-3-18 22:29
while((index=str.indexOf(key))!=-1)    是因为在indexOf方法中如果字符串中没有key这个值时就返回-1,如 ...

嗯 理解了 TKS
作者: 施家雄    时间: 2013-3-18 23:00
李尧 发表于 2013-3-18 22:20
1. public int indexOf(String str)如果字符串参数作为一个子字符串在此对象中出现,则返回第一个这种子字 ...

你好,我看你的回答,觉得很精辟,但是我觉得我还是有些不懂,就是用split时怎么就结果出现了5次了,你说截取的数组是[,ab,cd,ef,s],我还是不怎么懂,望解答,谢谢了!
作者: 郭利超    时间: 2013-3-18 23:06
施家雄 发表于 2013-3-18 23:00
你好,我看你的回答,觉得很精辟,但是我觉得我还是有些不懂,就是用split时怎么就结果出现了5次了,你说 ...

我理解当KK在开头的时候 第一个分割有一个空 这样计数器就就是5次[null,ab,cd,ef,s] 不知道对不对
作者: 黑马17期-闫东东    时间: 2013-3-18 23:07
郭利超 发表于 2013-3-18 22:46
嗯 理解了 TKS

:D客气了
作者: 施家雄    时间: 2013-3-18 23:32
郭利超 发表于 2013-3-18 23:06
我理解当KK在开头的时候 第一个分割有一个空 这样计数器就就是5次[null,ab,cd,ef,s] 不知道对不对 ...

嗯。。谢谢了~!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2