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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高阳 中级黑马   /  2013-1-1 10:20  /  1278 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        //查找字符串在字符串中出现的次数
public static void main(String[] args) {
                String s="nbakjhnbakhkhnbajkjnba";
                String str="nba";
                int a=fun(s,str);//调用fun方法
                System.out.println(a);
               
               

        }
        public static int fun(String s,String str){
                int cun=0;//定义统计变量
                int i=0;
                while((i=s.indexOf(str))!=-1){
                       
                        cun++;
                        s=s.substring(i));//截取字符串
                }
                return cun;
        }
为什么结果不正确啊

评分

参与人数 1技术分 +1 收起 理由
邵天强 + 1

查看全部评分

4 个回复

倒序浏览
你使用了 while((i=s.indexOf(str))!=-1) ,这个条件永远不为-1,死循环啊,indexOf获取的是在字符串中首次出现的位置,我看你的意思应该是想获取s字符串在str中出现了多少次

回复 使用道具 举报
本帖最后由 陈丽莉 于 2013-1-1 19:53 编辑

substring()截取时,起于括号中的数字。例如:"unhappy".substring(2) returns "happy";
这样截取后仍保留了str开始的地方,按你的程序说就是截取后仍是原字符串,进入了死循环。
所以只要将截取字符串这行, s=s.substring(i));这句中的i变为i+1就行了。
修改后程序如下:
//查找字符串在字符串中出现的次数
public static void main(String[] args) {
                String s="nbakjhnbakhkhnbajkjnba";
                String str="nba";
                int a=fun(s,str);//调用fun方法
                System.out.println(a);
               
               

        }
        public static int fun(String s,String str){
                int cun=0;//定义统计变量
                int i=0;
                while((i=s.indexOf(str))!=-1){
                        
                        cun++;
                        s=s.substring(i+1));//截取字符串
                }
                return cun;
        }

评分

参与人数 1技术分 +1 收起 理由
邵天强 + 1 鼓励一下,希望多上论坛

查看全部评分

回复 使用道具 举报
确实是死循环了,楼上说的对,你的subString()方法用错了,里面的参数,应该是新的起始位置,也就是你程序里面的i+str.length(),当然在你这里直接+1是对的,但是我觉得i+str.length()比较好,因为如果str = aaa,而在s里面有个aaaa的字符的话,只是+1会多算一次。
回复 使用道具 举报
嗯,如果查找字符串出现次数时,重用的情况不计算在内,那么楼上的方法是对的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马