[英]How to recursively print out each character one at a time in a String function
[英]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.