计算另一个字符串中的字符串出现次数

时间:2016-10-20 21:33:33

标签: java string

这是我的任务。我不被允许使用if语句。

编写一个程序NumStrings.java,它通过命令行接收两个字符串作为
输入然后打印出第二个字符串作为子字符串出现的次数 第一

我的错误代码:

public class Test {


    public static void main(String[] args) {
        String a = "HelloHelloHelloHello";
        String b = "Hello";
        int times = 0;
        for(int i=0; i <= a.length()-5; i++){
            for (int z=4; z<=(a.length()-1) && a.compareTo(b)==0; z++){
                times = times +1;
            }
        }
        System.out.print(times);
    }
}

2 个答案:

答案 0 :(得分:1)

使用GC.Collect(文档:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int)),这是正确的方法:

You may not have the required environment or OS to build this project

这是一种没有subString()语句的方法......我不推荐这样做。但如果你必须这样做,这将有效。

String a = "HelloHelloHelloHello";
String b = "Hello";
int times = 0;
for (int i = 0; i <= a.length() - b.length(); i++) {
    String substring = a.subString(i, i + b.length());
    if (substring.equals(b)) {
        times = times + 1;
    }
}
System.out.println(times);

答案 1 :(得分:1)

以这种方式看待:您不必计算在第一个字符串中找到第二个字符串的频率,因为您总是需要检查如果你找到了它。因此,为了避免各种条件或if语句,请考虑使用firstString.split(secondString)

一旦你&#34;拆分&#34;

split(someString)将返回一个剩余子串的数组每次找到子字符串时的基本字符串:

String first = "bababa";
String second = "a";
String[] substrings = first.split(second);

现在substrings将如下所示:["b", "b", b"]因为每个a已被删除,其余的被放入单独的字符串中。

接下来,您必须检查数组的大小,并且您将看到first字符串被拆分的频率。

int count = substrings.length;   // 3

但是,这不是它的结束,因为我们仍然有以下情况:

 String first = "bababaa";

使用上述解决方案,您将得到一个大小为3的数组:["b", "b", "b"]a的最后一次出现只会被删除而不会留下任何子串(甚至不是空的'')。

所以你可以利用另一个(略有不同)split()

  first.split(second, limit);   

其中limit是方法尝试查找的最大出现次数。那你多久能在第一个字符串中找到你的第二个字符串?第一个字符串包含许多字母:int limit = first.length

 first.split(second, first.length);  // will produce [b, b, b, , ]

你能看到会发生什么吗?最后有两个空字符串,其中有两个a。在第二个String出现之后或之前找到的所有内容都会得到一个子字符串数组。

当然,当你分割字符串ba时,你会得到["b", ] 2个子串。但是你不关心b只是&#34; 逗号&#34;在中间(每a,)。

 first.split(second, first.length).length -1;   // that's how many commas there are, and thats how many second strings there are

修改
(感谢@ saka1029!)所以,&#34;分裂&#34;方法在first="aaa"second="aa"时仍会遗漏某些内容,因为它只计算1次而不是2次 为了纠正我的想法,我想循环遍历整个第一个字符串,只检查第一个字符串,然后删除第一个字母并继续(因为OP已经接受了另一个答案,我只是发布我的代码) :

  String first = "ZZZ";
  String second = "ZZ";
  int counter = 0;           // counts the number of occurrences
  int n = first.length();    // needs to be fixed, because we'll change the length of the first string in the loop
  for(int i = 0; i < n; i++){  // check the first string letter by letter
      String[] split = first.split(second, 2);  // we want one substring and the rest (2 in total) like: ['', 'Z'] when we cut off the first 'ZZ'
      counter += split.length - 1;  // now add the number of occurrences (which will be either 0 or 1 in our case)
      first = first.substring(1);   // cut off the first letter of the first string and continue
   }
   System.out.println("counter = " + counter);  // now we should get 3 for 'ZZZ'