开发者社区> 问答> 正文

java中字符串查找"java"个数报错求指教 400 请求报错

正确结果为5 我代码输出为8 没找出问题 求指教 class Test {     public static void main(String[] args) {         String s = "sunjavacjavaeeejavapuujavakkkjava";         int count = 0;         int x = 0;         if (s.contains("java")) {             x = s.indexOf("java");             count++;         }         int y = x + 4;         for (int z = 0; z != -1 && y < s.length(); y += 4) {             z = s.indexOf("java", y);             count++;         }         System.out.println(count);     } }

展开
收起
kun坤 2020-05-29 10:59:35 536 0
1 条回答
写回答
取消 提交回答
  • String s = "javasunjavacjavaeeejavapuujavakkkjavaiijavajava";
    int count = 0;
    int y=0;
    for (int z = 0;  z!=-1 && y < s.length()-4; y = z+4) {
        z = s.indexOf("java", y);
        if (z != -1) {
            count++;
        }else{
            break;
        }
    }
    System.out.println(count);
    直接循环判断,不等于-1就加一个。  ######的确如此,如果java不是在字符串最后,会多遍历一次,多一次计数。所以,此答案有 bug(漏洞),有待进一步改正,之后再测试。######回复 @rigel : 干脆在if后面加上else{break;}######回复 @孤月殇 : 我也发现了。条件应该改为y<s.length()-4 。这样就可以避免多循环一次######结束条件还是有问题,如果java不是在字符串最后,会多遍历一次######OK了 感谢 还是需要声明z 我开始逻辑错了######
        public static void main(String[] args) {
            String s = "sunjavacjavaeeejavapuujavakkkjava";
            int oldLength = s.length();
            s = s.replaceAll("java", "");
            int count = (oldLength - s.length()) / 4;
            System.out.println(count);
        }
     ######妙!######
    public static void main(String[] args) {
        String s = "sunjavacjavaeeejavapuujavakkkjava";
        int y = 0;
        while (s.indexOf("java")!=-1){
            y++;
            s = s.substring(s.indexOf("java")+4);
        }
        System.out.println(y);
    }
    ######有理。######
    package com.company;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Main {
    
        public static void main(String[] args) {
            String s = "sunjavacjavaeeejavapuujavakkkjava";
            Pattern p=Pattern.compile("java");
            Matcher m=p.matcher(s);
            int count = 0;
            while(m.find()) {
                count++;
            }
            System.out.println(count);
        }
    }
    ######用正则不是更方便么 String s = "javasunjavacjavaeeejavapuujavakkkjavajjjjava";                  Pattern p = Pattern.compile("java");         Matcher matcher = p.matcher(s);         int count = 0;         while(matcher.find()) {             count++;         }         System.out.println( count);######的确如此。######
     public static void main(String[] args) {
            final String originalString = "sunjavacjavaeeejavapuujavakkkjavass";
            final String subString = "java";
    
            System.out.println(countStr(originalString, subString));
        }
    
        /**
         * 查找指定字符串在另一个字符串中出现的次数
         *
         * @param originalString 被查找的原是字符串
         * @param subString      需要查找的子串
         * @return 子串出现的次数
         */
        private static int countStr(String originalString, String subString) {
    
            // 要查找的子串的长度
            final int subStringLength = subString.length();
    
            //开始查找字符串时的起始位置
            int fromIndex = 0;
    
            //子串出现的次数
            int count = 0;
    
            while ((fromIndex = originalString.indexOf(subString, fromIndex)) > -1) {
                fromIndex += subStringLength;
                count++;
            }
    
            return count;
        }
     ######没错。######public static void main(String[] args) {         String str = "sunjavacjavaeeejavapuujavakkkjava";         String[] javas=str.split("java", -1);         System.out.println("一共有java:"+(javas.length-1)+"个");     } 一行代码就搞定的事情######把x,y,z的值打印出来。主要是y和z本应该是有关联的,在下一步里:y=z+4。你这样写y是等差递增,而z就有可能重复######已经解决 不需要声明z int y = x + 4; for (; y != -1 && y < s.length(); y+= 4) { y = s.indexOf("java", y); count++; 应该是这样 我逻辑错了 谢谢######没明白呢######遍历就可以简单的解决了, for(int i=0;i<s.length()-4;i++){   if(s[i]='j' && s[i+1]='a'&& s[i+2]='v' && s[i+3]='a')    count++ }######回复 @A_zu : z = s.indexOf("java", y); 这里取值有问题######回复 @羊9527 : 确实没对 我在后面多加了几个字符就无限循环了######回复 @羊9527 : 不会啊 最后一个java的位置获取后 角标+4(也就是"java"的长度)后就越界了 不满足y<s.length()了######回复 @A_zu : z!=-1 判断不对,比如你这个例子,最后4个字符是java,那么你任何一次循环IndexOf,z都是大于-1的。######已经解决 不需要声明z int y = x + 4; for (; y != -1 && y < s.length(); y+= 4) { y = s.indexOf("java", y); count++; 应该是这样 我逻辑错了 谢谢######建议改写成下列简洁代码,以求得 任意字符串元素,如“java”, 在 数据字符串  s 中出现的次数。
    public class A{
    // 方法 frequency 返回 s0 在 s 中出现的次数
    static int frequecy(String s, String s0){
      int count=0;
      int i=0; 
       while (true){
        i = s.indexOf(s0);
          if (i != -1){
        s = s.substring(i+s0.length());
        count++;
        } else
       break;
      }
      return count; 
     }
    
     public static void main(String args[]){
     String s = "sunjavacjavaeeejavapuujavakkkjava";
     System.out.printf("字符串java出现: %d  次。\n",frequecy(s,"java"));
      }
    }
     输出: 字符串java出现: 5  次。######。。排版
    2020-05-29 14:36:20
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载