如何以递归方式获取输入字符串并返回每个字符重复的字符串?

时间:2015-04-24 10:22:14

标签: java string recursion

基本上我有一项任务要求我编写一个名为stutter的方法。 stutter方法应该接受一个输入String并返回每个字符重复的字符串。例如,如果输入字符串是" help"那么运行这个方法的结果应该是" hheellpp"。我已经尝试了很多不同的东西,无法让它发挥作用。这是我的代码:

import java.util.*;

public class Stutter {  
    static String stutterString = "";

    public static String stutter ( String s ) {
        char ch = s.charAt (0);
        String tempString = String.valueOf ( ch );
        if ( s.length() == 0 ) {
            return stutterString;
        } else {
            stutterString += tempString + tempString;
            return stutter ( s.substring (1) );
        }
    }

    public static void main ( String [] args ) {
        Scanner inputScanner = new Scanner ( System.in );
        System.out.println ( "What word would you like to stutter?" );
        String userInput = inputScanner.next();     
        inputScanner.close();       
        System.out.println ( stutter ( userInput ) );
    }
}

我收到一个错误,我不知道该怎么做。这是错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(Unknown Source)
    at Stutter.stutter(Stutter.java:12)
    at Stutter.stutter(Stutter.java:23)
    at Stutter.main(Stutter.java:41)

任何帮助将不胜感激。这不是一个庞大的计划。如您所见,我已经发布了我正在使用的整个Stutter课程。它只是在烦我,因为我确定有一个简单的解决办法,但我没有看到它。

7 个答案:

答案 0 :(得分:2)

您需要更改此行

char ch = s.charAt (0);

char ch = s.length() > 0 ? s.charAt(0) : ' ';

您的代码将按预期工作。

更好更清晰的解决方案是:

if (s.length() == 0) {
    return stutterString;
} else {
    char ch = s.charAt(0);
    String tempString = String.valueOf(ch);
    stutterString += tempString + tempString;
    return stutter(s.substring (1));
}
  你想用什么词来口吃?
  >> ABCDEFG
  >> aabbccddeeffgg

说明:

s.charAt(0)为空字符串时,尝试s时会发生什么?您未验证s是否为空,添加简单检查s.length() > 0就是您所缺少的。

提示:始终使用调试器,它可以帮助您,您在使用它时更好地了解程序的流程。另外,在编写递归时,使用铅笔和纸来绘制调用将有助于您理解它。

答案 1 :(得分:2)

我是这样做的:

我的基本情况是当字符串的长度小于1时,在这种情况下它将返回“”。

否则会打印两次字符串的第一个字符,然后再次调用stutter方法。

我将原始字符串作为参数传入,除了我已从中删除了第一个字符。这样,原始字符串的第二个字符将在下一次打印出两次,字符串变短。

import java.util.*;

public class Stutter {  

    public static String stutter ( String s ) {
        if(s.length() < 1) return "";
        else{
            return "" + s.charAt(0) + s.charAt(0) + stutter(s.substring(1,s.length()));
        }
    }

    public static void main ( String [] args ) {
        Scanner s = new Scanner ( System.in );
        System.out.println ( "What word would you like to stutter?" );
        String userInput = s.nextLine();
        System.out.println(stutter(userInput));
    }
}

答案 2 :(得分:1)

提示:如果s.length()为零,则s.charAt(0)将抛出异常...因为您正在尝试获取超出零长度字符串末尾的字符。

答案 3 :(得分:1)

s之前检查s.charAt (0)变量的长度。例如,移动

char ch = s.charAt (0);
String tempString = String.valueOf ( ch );

to else block

答案 4 :(得分:1)

这个怎么样:

public class Stutter {
    private static String head(String str) {
        return str.substring(0,1);
    }

    private static String tail(String str) {
        return str.substring(1);
    }

    private static String stutter(String str) {
        if (str.length() > 0)
            return head(str)+head(str)+stutter(tail(str));
        else
            return "";
    }

    public static void main(String args[]) throws Exception  {
        if (args.length > 0) {
            System.out.println(stutter(args[0]));
        }
    }
}

答案 5 :(得分:-1)

使用String.replaceAll()

可以非常简单地实现
public class Stutter {
    public static void main (String args[]) {
        String TEST_STRING = "abcdefg";
        System.out.println(stutter(TEST_STRING));
    }

    private static String stutter(String s) {
        return s.replaceAll("(.)", "$1$1");
    }
}

答案 6 :(得分:-2)

Editted。

import java.util.*;

public class Stutter {

    static String stutterString = "";

    public static String stutter ( String s ) {
        if(s.length() > 0)
        {
            return stutterString.concat(s.substring(0,1)).concat(s.substring(0,1)).concat(stutter(s.substring(1)));
        }
        else
        {
            return stutterString;
        }
    }

    public static void main ( String [] args ) {


        Scanner inputScanner = new Scanner ( System.in );

        System.out.println ( "What word would you like to stutter?" );
        String userInput = inputScanner.next();

        inputScanner.close();

        System.out.println ( stutter ( userInput ) );

    }

}