当我运行测试器类时,它无法通过第一个字母。它输出一个"!"标记,而不是继续打印单词的其余部分。不知道为什么它总是挂断。递归方法似乎卡住了,无法继续超过第一个字符。而不是打印"!olleH",我只得到"!"。谢谢!
/**
Class reverses text of word
*/
public class Sentence
{
private String text="";
/**
Constructs a sentence
@param word
*/
public Sentence(String textIN)
{
text=textIN;
}
/**
gets text
@return text
*/
public String getText()
{
return text;
}
/**
Reverse word
*/
public String reverse()
{
if (text.length() <= 1)
{
return text;
}
else
{
char val = text.charAt(0);
text=text.substring(1);
return reverse() + val;
}
}
}
/**
A tester class for reversing a sentence.
*/
public class SentenceTester
{
public static void main(String[] args)
{
Sentence greeting = new Sentence("Hello!");
greeting.reverse();
System.out.println(greeting.getText());
System.out.println("Expected: !olleH");
}
}
从代码的通读来看,您的反向方法似乎有效 - 它返回原始文本的反向。但是,它通过改变text
的值来做到这一点,并且它永远不会将最终值放入text
。
实际发生的是,text
变短了一个字符(从前面删除),直到只剩下一个字符 - !
.
因此,您可以在主要方法中解决问题:
public static void main(String[] args)
{
Sentence greeting = new Sentence("Hello!");
String result = greeting.reverse();
System.out.println(result);
System.out.println("Expected: !olleH");
}
我希望你喜欢这样。仅供参考,您可以在下面使用 -
String reversedString = new StringBuilder("Original String").reverse().toString();
还有一件事,如果您传递空值,您的代码将不起作用:)
你的代码的问题是,你正在修改else块中的文本。
text = text.substring(1);
所以最后它只成立!
这是最终程序(刚刚更改了 return 语句):
/**类反转单词的文本*/
公开课 句子{ 私有字符串文本=";
/** Constructs a sentence @param word */ public Sentence(String textIN) { text=textIN; } /** gets text @return text */ public String getText() { return text; } /** Reverse word */ public String reverse() { if (text.length() <= 1) { return text; } else { char val = text.charAt(0); text=text.substring(1); return (text=reverse() + val); } } }
原因很简单 - 字符串是不可变的。每次您希望更改它时,请再次将其重新分配。