初学者编程练习(Java):递归计算字符串(.equals()?)中的子字符串实例

初学者编程练习(Java):递归计算字符串(.equals()?)中的子字符串实例,java,string,recursion,Java,String,Recursion,我正在通过Codingbat.com上的一套在线练习练习,以自娱自乐。一组练习侧重于递归编程。在其中一个练习中,我编写了以下函数来返回所传递字符串中字符“x”的频率: public int countX(String str) { /*Given a string, compute recursively (no loops) the number of lowercase 'x' chars in the string.*/ if (str.length

我正在通过Codingbat.com上的一套在线练习练习,以自娱自乐。一组练习侧重于递归编程。在其中一个练习中,我编写了以下函数来返回所传递字符串中字符“x”的频率:

       public int countX(String str) {
/*Given a string, compute recursively (no loops) the number of lowercase 'x' 
chars in the string.*/
            if (str.length()< 1){
                return 0;
            }else if (str.charAt(0) == 'x'){
                return countX(str.substring(1)) + 1;
            }else{
                return countX(str.substring(1));
            }
}
但是,它始终返回0。看起来像是测试条件

 }else if (str.substring(0, 1).equals("hi")){
从未见过,但我不知道为什么。希望有人能帮忙

编辑:

正如Steve和JustinKSU指出的,我返回的是单个字符的子字符串。我认为
substring()
方法中的索引号引用字符的索引,就好像它们存储在一个数组中一样(其中0将是第一个字符,1秒等等)。考虑这个问题似乎更好的方法是
substring()
索引表示字符串中字符分隔符的计数,从第一个字符前面的分隔符开始(这样
子字符串(0,1)
封装第一个字符)。

str.substring(0,1)

将只返回一个字符,因此它永远不会与包含2个字符的“hi”匹配。你应该试试

str.substring(0,2)
相反

str.substring(0,1)

将只返回一个字符,因此它永远不会与包含2个字符的“hi”匹配。你应该试试

str.substring(0,2)
而不是您要查找的

str.substring(0, 2)
你在找什么

str.substring(0, 2)

可以避免使用subString()并消除复杂性

public static int countHi(String str){
      if(str.length() > 0){
         if(str.contains("hi")){
           return  countHi(str.replaceFirst("hi","")) + 1;
         }  
      }
     return 0;
}

可以避免使用subString()并消除复杂性

public static int countHi(String str){
      if(str.length() > 0){
         if(str.contains("hi")){
           return  countHi(str.replaceFirst("hi","")) + 1;
         }  
      }
     return 0;
}

substring()
的第二个参数是独占的。
substring()
的第二个参数是独占的。我是个白痴。谢谢,我是个白痴。同意:见Steven的答案同意:见Steve的答案