簡體   English   中英

如何遞歸獲取輸入字符串並返回每個字符重復的字符串?

[英]How to recursively take an input string and return a string with each character repeated?

基本上我有一個任務,要求我編寫一個名為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類。 這只是困擾我,因為我確信有一個簡單的解決方案,但我沒有看到它。

你需要改變這一行

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
>> aabbccddeegggg

說明:

s是空字符串時嘗試s.charAt(0)會發生什么? 你沒有驗證s不是空的,添加簡單的檢查s.length() > 0就是你所缺少的。

提示:始終使用調試器,它可以幫助您,您可以在使用它時更好地理解程序的流程。 此外,在編寫遞歸時,使用鉛筆和紙張繪制調用將有助於您理解它。

我是這樣做的:

我的基本情況是當字符串的長度小於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));
    }
}

提示:如果s.length()為零,則s.charAt(0)將拋出異常...因為您正在嘗試獲取超出零長度字符串末尾的字符。

s.charAt (0)之前檢查s變量的長度。 例如,移動

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

否則阻止

這個怎么樣:

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]));
        }
    }
}

這可以使用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");
    }
}

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 ) );

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM