[英]Recursion to find the number of occurrences of a specified character in a string
我在这里看到了这个问题的解决方案,但人员代码与我的不同。 我只想知道我做错了什么。 我对编程非常陌生,并且渴望成为好人。
问题:(字符串中指定字符的出现次数)编写一个递归方法,使用以下标题查找字符串中指定字符的出现次数:
public static int count(String str, char a)
例如: count("Welcome", 'e')
返回2
。 编写一个测试程序,提示用户输入后跟一个字符的字符串,并显示该字符在字符串中出现的次数。
我的代码有问题:
线程“main”中的异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1
我的代码:
import java.util.Scanner;
public class Exercise18_10{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("Please enter a string");
String str = input.next();
System.out.println("Please enter a character");
char car = input.next().charAt(0);
int x = count ("welcome", 'e');
System.out.println("The number of character " +car + " in string " +str + " = "+ x);
}//main
public static int count(String str, char a){
int ct = 0;
if(str.length()>0)
if(str.charAt(0) == a)
ct ++;
count(str.substring(1),a);
return ct;
}
}
请帮助,我做错了什么?
其他答案是正确的; 您需要在调用str.substring(1)
之前检查字符串的长度。 但是,您不需要其他方法来维护ct
变量。 这是一个 Java 101 合适的答案:
import java.util.Scanner;
public class Exercise18_10 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Please enter a word: ");
String word = input.next();
System.out.print("Please enter a character: ");
char c = input.next().charAt(0);
int count = count(word, c);
System.out.println(String.format("%d occurrences of %c in '%s'", count, c, word));
}
public static int count(String str, char a) {
if (str.length() == 0) {
return 0;
}
int count = 0;
if (str.charAt(0) == a) {
count++;
}
return count + count(str.substring(1), a);
}
}
我认为索引超出范围错误一定是因为count(str.substring(1),a);
当您遇到字符串只有一个字母的情况时,您尝试获取没有它的字符串,即没有。
ps:修复后,您还应该检查如何添加和保留 ct 变量的值...
关于错误,当您连续substring(1)
时会发生什么? 你最终会得到一个你不能子串的空字符串! 您的if str.length() > 0
不会阻止substring
调用。
另一个问题 - 每次调用该方法时, ct
变量都会被重置为 0,因为它的作用域是该方法的本地范围。
你可以让ct
成为一个静态变量,但我会解决这个问题的方式 - 实现另一种方法来维护一个ct
变量参数。
private static int countHelper(String str, char a, int count){
if (str == null || str.length() <= 0) return count; // End recursion
if(str.charAt(0) == a)
count++; // Increment count
// No need for an else statement, recurse with substring
return countHelper(str.substring(1), a, count);
}
然后,您的实际方法只是委托给另一个
public static int count(String str, char a) {
return countHelper(str, a, 0);
}
您需要在if{...}
写入count(str.substring(1), a)
。 在你的代码的另一个主要问题是count
不能rescurve保存,你应该做的count
静态或更改您的代码如下所示。
public static int count(String str, char a) {
int ct = 0;
if (str.length() > 0) {
if (str.charAt(0) == a)
ct++;
ct += count(str.substring(1), a);
}
return ct;
}
public static int count(String str, char a) {
int ct = 0;
if (str.length() > 0) {
if (str.charAt(0) == a) {
ct++;
}
return ct + count(str.substring(1), a);
}
return ct;
}
对于递归函数,总是找出终止条件并从那里退出函数,如果适用,使用默认值。 在这种情况下,如果字符串的长度为0
,则返回 count 0。在另一种情况下(字符串长度大于 0)再次调用您的函数。
此外,您需要将函数的值和计数作为总和返回,以获得函数第一次调用的最终计数总数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.