黑马程序员技术交流社区

标题: 求一个子串在另外一个字符串中出现的个数? [打印本页]

作者: 黄丽慧    时间: 2012-7-12 15:33
标题: 求一个子串在另外一个字符串中出现的个数?
假设存在两个字符串String content="ladfjieiafiejleoliaefleoliajefleo"和String name = "leo";写一个函数来计算name在content中出现的次数,下面是我写的代码,大家帮我看看函数里面哪里出错误了。
public class StringTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
               
                String content="ladfjieiafiejleoliaefleoliajefleo";
                String name = "leo";
                int x=findContent(content,name);
                System.out.println(name+"在"+content+"中出现了"+x);

        }
        public static int findContent(String s,String st)
        {
                int count=0;
                int i=0;
                int t=0;               
                while(s.indexOf(st, i)!=-1)
                {
                        t=i;
                        i=s.indexOf(st, i);
                        if(i!=t)
                                count++;
                }
                return count;
        }

}



作者: 王珏    时间: 2012-7-12 16:24
public class StringTest {

        /**
          * @param args
          */
         public static void main(String[] args) {
                 
                String content="ladfjieiafiejleoliaefleoliajefleo";
                 String name = "leo";
                 int x=findContent(content,name);
                 System.out.println(name+"在"+content+"中出现了"+x);

        }
         public static int findContent(String s,String st)
         {
                 int count=0;
                 int i=0;
                 int t=0;               
                while(s.indexOf(st, i)!=-1)
                 {
                         t=i;
                         i=s.indexOf(st, i);
                         if(i!=t)
                                 count++;
                         i=i+st.length();
                 }
                 return count;
         }

}

你没将i 的值改变,i是第一次indexOf获得的角标,而且是一直循环第一次找到的角标。第一次indexOf获得角标后,应该将i加上子串的长度,重后面开始找。


作者: 邓杰    时间: 2012-7-12 16:25
//你的代码很乱,你把一简单的事情想的太复杂;
//JAVA中用角标确定区间的时候有一个规律:含头不含尾;
public class StringTest {

        /**
          * @param args
          */
         public static void main(String[] args) {
                 
                String content="ladfjieiafiejleoliaefleoliajefleo";
                 String name = "leo";
                 int x=findContent(content,name);
                 System.out.println(name+"在"+content+"中出现了"+x);

        }
         public static int findContent(String s,String st)
         {
                 int count=0;
                 int i=0;
                 int t=0;               
               / /你无非就是想用一变量记录住st第一次出现的位置然后在第二次循环的时候从新的位置上开始检索嘛;
                while(s.indexOf(st, i)!=-1)                          //1 这样写whlile((i=s.indexOf(st,i))!=-1)用i记录住了st第一次出现的角标;
                 {                                                             //上面用i记住了st第一次出现的位置所以第二就从上次出现st的角标开始检索
                         t=i;//这个真心不懂是怎么回事;        //i=i+st.length();之所以要加上st.length()是因为java中含头不含尾的规律;如果不加入st.length(),下次他还回把第一次出现
                                                                              //st的位置返回去,也就是会死循环;
                                                                              //返回count++就可以了;
                         i=s.indexOf(st, i);//2 这句就省略了;  
                         if(i!=t)//这个也不懂;
                                 count++;
                 }
                 return count;
         }

}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
修改后的代码;
public class StringTest {

public static void main(String[] args) {
        String content="ladfjieiafiejleoliaefleoliajefleo";
         String name = "leo";
         int x=findContent(content,name);
         System.out.println(name+"在"+content+"中出现了"+x);
}
public static int findContent(String s,String st)
{
         int count=0;
        /* int i=0;
        while((i=s.indexOf(st, i))!=-1)
         {
                 i=i+st.length();
                 count++;
         }
         */
         //用for循环其实简单;i只是作为一个变量存在,用完就会被释放,可以节约内存,代码更优化一些;
        for(int i=0;(i=s.indexOf(st,i))!=-1;){
         i=i+st.length();
         count++;
        }
         return count;
}
}


作者: 封明川    时间: 2012-7-12 16:47
本帖最后由 封明川 于 2012-7-12 16:53 编辑

public static void main(String[] args) {
               
                String content="ladfjieiafiejleoliaefleoliajefleo";
                String name = "leo";
                int x=findContent(content,name);
                System.out.println(name+"在"+content+"中出现了"+x);

        }
        public static int findContent(String s,String st)
        {
                int count=0;
                int i=0;
                //int t=0;  这个可以注释掉               
                while(s.indexOf(st, i)!=-1)
                {
                        
                      // t=i;  这个也可以注释掉,你想的太复杂了,你用这个判断的话,
                      // i=s.indexOf(st, i);  这里还是会从第一个开始找,而不会结束循环,形成死循环了
                        i=s.indexOf(st, i) + st.length();
                       // if(i!=t)  可以不用判断的,只要存在就count就自增一次
                                count++;
                }
                return count;
        }
}





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