Java:计算字符串中序列的频率

Java:计算字符串中序列的频率,java,arrays,string,split,count,Java,Arrays,String,Split,Count,我正在编写一个简单的程序,计算序列在字符串中出现的次数 案例1: 给定字符串:EATNEATMMMMEAT 给定顺序:吃 程序应返回值3 案例2: 给定字符串:EATEAT 给定顺序:吃 程序应该返回2 import java.util.*; public class FrequencyOfSequence { //Finds the frequency of a sequence in a string s public static void main(String[] args)

我正在编写一个简单的程序,计算序列在字符串中出现的次数

案例1:

给定字符串:EATNEATMMMMEAT

给定顺序:吃

程序应返回值3

案例2:

给定字符串:EATEAT

给定顺序:吃

程序应该返回2

import java.util.*;
public class FrequencyOfSequence { //Finds the frequency of a sequence in a string s
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        String sequence = in.nextLine();
        String[] cArr = s.split(sequence);

        System.out.println(cArr.length); 

    }
}
我的程序适用于案例1。它在第二种情况下失败,因为
s.split(sequence)
删除了两个“EAT”,留下一个大小为0的数组


有办法解决这个问题吗

一个选项是使用
replace()
删除匹配项并计算大小差异:

int count = (s.length() - s.replace(sequence, "").length()) / sequence.length();
如果您想使用
split()
方法,如果您这样使用它,它应该可以工作:

int count = s.split(sequence, -1).length - 1;
-1
参数告诉方法不要丢弃尾随的空字符串。然后我们从长度中减去1以避免围栏柱问题。

使用正则表达式:

Pattern pattern = Pattern.compile(sequence);
Matcher  matcher = pattern.matcher(s);

int count = 0;
while (matcher.find())
    count++;

System.out.println(count);

这里还有一个你想尝试的选项

     int count=0;
if(s.endsWith(sequence)){
     count=s.split(sequence).length;}
else{
  count=s.split(sequence).length-1;
}

不要使用String#split,只需自己在一个循环中解析字符串。一个很好的循环ol'indexOf loop重叠匹配呢?例如,如果你在“EEE”中搜索“EE”,那是2还是3?@shmosel这是1操作,我是说1还是2。我不明白。在EATEAT returns上执行此操作6.此操作有效。但类似于我的解决方案是否可行?