这是我的任务。我不被允许使用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);
}
}
答案 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)
。
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'