java中字符串查找"java"个数出错求指教

A_zu 发布于 07/24 14:27
阅读 739
收藏 0

正确结果为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);

    }
}

加载中
0
r
rigel
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就加一个。

 

tcxu
tcxu
的确如此,如果java不是在字符串最后,会多遍历一次,多一次计数。所以,此答案有 bug(漏洞),有待进一步改正,之后再测试。
风青山
风青山
回复 @rigel : 干脆在if后面加上else{break;}
r
rigel
回复 @孤月殇 : 我也发现了。条件应该改为y<s.length()-4 。这样就可以避免多循环一次
孤月殇
结束条件还是有问题,如果java不是在字符串最后,会多遍历一次
A
A_zu
OK了 感谢 还是需要声明z 我开始逻辑错了
2
银色的猫
银色的猫
    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);
    }

 

tcxu
tcxu
妙!
1
抖M_William
抖M_William
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);
}
tcxu
tcxu
有理。
1
pangPython
pangPython
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);
    }
}
1
hakcker5
hakcker5

用正则不是更方便么

String s = "javasunjavacjavaeeejavapuujavakkkjavajjjjava";
        
        Pattern p = Pattern.compile("java");
        Matcher matcher = p.matcher(s);
        int count = 0;
        while(matcher.find()) {
            count++;
        }
        System.out.println( count);

tcxu
tcxu
的确如此。
1
吃竹子的程序熊
吃竹子的程序熊
 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;
    }

 

tcxu
tcxu
没错。
1
内部人员001

public static void main(String[] args) {
        String str = "sunjavacjavaeeejavapuujavakkkjava";
        String[] javas=str.split("java", -1);
        System.out.println("一共有java:"+(javas.length-1)+"个");
    }

一行代码就搞定的事情

0
风青山
风青山
把x,y,z的值打印出来。主要是y和z本应该是有关联的,在下一步里:y=z+4。你这样写y是等差递增,而z就有可能重复
A
A_zu
已经解决 不需要声明z int y = x + 4; for (; y != -1 && y < s.length(); y+= 4) { y = s.indexOf("java", y); count++; 应该是这样 我逻辑错了 谢谢
A
A_zu
没明白呢
0
羊9527

遍历就可以简单的解决了,

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++

}

抖M_William
抖M_William
回复 @A_zu : z = s.indexOf("java", y); 这里取值有问题
A
A_zu
回复 @羊9527 : 确实没对 我在后面多加了几个字符就无限循环了
A
A_zu
回复 @羊9527 : 不会啊 最后一个java的位置获取后 角标+4(也就是"java"的长度)后就越界了 不满足y<s.length()了
羊9527
回复 @A_zu : z!=-1 判断不对,比如你这个例子,最后4个字符是java,那么你任何一次循环IndexOf,z都是大于-1的。
A
A_zu
已经解决 不需要声明z int y = x + 4; for (; y != -1 && y < s.length(); y+= 4) { y = s.indexOf("java", y); count++; 应该是这样 我逻辑错了 谢谢
下一页
0
tcxu
tcxu

建议改写成下列简洁代码,以求得 任意字符串元素,如“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  次。

蓝风970655147
蓝风970655147
。。排版
返回顶部
顶部