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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卜弦 中级黑马   /  2013-10-21 10:51  /  1093 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 卜弦 于 2013-10-21 18:22 编辑

  1. <P>class StringTest2
  2. {</P>
  3. <P>public static int getTimes2(String s,String key)
  4.         {
  5.                 int count=0;
  6.                 int index=s.indexOf(key);                          
  7.                 while (index!=-1 )
  8.                 {
  9.                         System.out.println("s="+s);
  10.                         s=s.substring(index+key.length());        
  11.                         count++;
  12.                 }
  13.                 return count;
  14.         }
  15.         public static void main(String[] args)
  16.         {
  17.                 String s="abkkcdkkefkkskksde";
  18.                 int count=getTimes2(s,"kk");
  19.                 System.out.println("count="+count);
  20.         }
  21. }
  22. </P>
复制代码
不知道为什么,这个程序总是提示角标越界。但是如果把
int index=s.indexOf(key);                     while (index!=-1 )
这两句改为:
int index=0;
while ((index=s.indexOf(key))!=-1 )  就没有问题了
请问第一种为什么会报错?这两种写法差别在哪里?

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
第一种写法:
循环只是判断到了字符串末尾没有循环内部做的事就是:输出当前字符串-->获取子串-->count++
中间没有判断过key是否在新的字符串中
第二种写法:
循环条件是:每次得到的字符串中返回key的索引index,且没有到字符串末尾
这里相比第一种多加了个每次在新的字符串中寻找key的过程

所以第二种对的
另外,你要是用第二种写法,不知道你有没有考虑过传入的字符串是kkk,key=kk的问题

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 很给力!

查看全部评分

回复 使用道具 举报
我把你的代码改了一下,添加了注释,希望能帮到你
  1. class Test1
  2. {
  3.         public static int getTimes2(String s,String key)
  4.         {
  5.                 int count=0;
  6.                 int index=s.indexOf(key); //如果没有越界,你下面的循环是不停重复的,直到角标越界                        
  7.                 while (index!=-1 )
  8.         {
  9.                           System.out.println("s="+s);
  10.                           //这样获得的子串每次获得的都是减少同样长度的子串
  11.                           s=s.substring(index+key.length());
  12.                           //当获取子串后还要判断字串中是否含有该key,并重新获取角标,添加下面语句
  13.                           //你的第二种写法就是把下面语句赋值到判断上
  14.                           index = s.indexOf(key);
  15.                           count++;
  16.         }
  17.                         return count;
  18.         }
  19.         public static void main(String[] args)
  20.         {
  21.                 String s="abkkcdkkefkkskksde";
  22.                 int count=getTimes2(s,"kk");
  23.                 System.out.println("count="+count);
  24.         }
  25. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

回复 使用道具 举报
首先:你这个方法中 while的循环条件有问题 没有结束标记
结合你这个字符串来说 while中的index是个固定的值 也就是2  而每次循环判断2!=-1 条件都满足
所以这样定义循环是停不下来的 就会一直去取子串  
其次:s=s.substring(index+key.length());         中的index+key.length()也是个固定的值,你这个例子中的就是2+2=4,所以每次去子串的时候都是从取到的子串中的第四位开始取,那不断循环最后的结果肯定是角标越界异常。

最后:修改后的int index=0;
while ((index=s.indexOf(key))!=-1 )  中,s是变化的 是取后的子串,自然index也是随着s的变化在变化的。
回复 使用道具 举报
你看看这个:原因我在代码中有解释
  1. package com.itheima;

  2. class MyMenuDemo {

  3.         public static int getTimes2(String s, String key) {
  4.                 int count = 0;
  5.                 int index = s.indexOf(key);
  6.                 while (index != -1) {
  7.                         System.out.println("s=" + s);
  8.                         s = s.substring(index + key.length());
  9.                         index=s.indexOf(key);/*我在你源码的基础上加了这句话,如果不加这句index的值一直是2
  10.                                                "index + key.length()"这个式子的值一直是4(相当于一直substring(4,length()-1))
  11.                                                执行4次后s变成:“de”,再执行一次就会报空指针异常了(因为长度现在是2,没有角标4)
  12.                                                            */
  13.                         count++;
  14.                 }
  15.                
  16.                 return count;
  17.         }

  18.         public static void main(String[] args) {
  19.                 String s = "abkkcdkkefkkskksde";        //
  20.                 int count = getTimes2(s, "kk");
  21.                 System.out.println("count=" + count);
  22.         }
  23. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马