【问题标题】:Beginner programming exercises (Java): recursively counting instances of substring in string (.equals()?)初学者编程练习(Java):递归计算字符串中子字符串的实例(.equals()?)
【发布时间】:2014-04-06 16:59:58
【问题描述】:

我正在完成 Codingbat.com 上的一组在线练习,以供我自己消遣。一组练习侧重于递归编程。在其中一个练习中,我编写了以下函数来返回传递的字符串中 char '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));
            }
}

根据 Codingbat 网站,这很好用。

下一个练习是计算字符串中子字符串“hi”的频率。我尝试调整我以前的方法,使用substring() 而不是charAt()

       public int countHi(String str) {
/*Given a string, compute recursively (no loops) the number of times lowercase 
"hi" appears in the string.*/
              if (str.length()< 2){
                return 0;
            }else if (str.substring(0, 1).equals("hi")){
                return countHi(str.substring(1)) + 1;
            }else{
                return countHi(str.substring(1));
            }
}

但是,这总是返回 0。它看起来像测试条件

 }else if (str.substring(0, 1).equals("hi")){

从未见过,但我不知道为什么。希望有人能帮忙!

编辑:

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

【问题讨论】:

标签: java string recursion


【解决方案1】:

str.substring(0, 1)
只会返回一个字符,所以它永远不会匹配有 2 个字符的“hi”。你应该试试

改为str.substring(0, 2)

【讨论】:

  • 我是个白痴。谢谢。
【解决方案2】:

你正在寻找

str.substring(0, 2)

【讨论】:

  • 同意:见史蒂夫的回答
【解决方案3】:

您可以避免使用 subString() 并摆脱复杂性。

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

【讨论】:

    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多