Java 使用堆栈反转句子中的单词
如果一次输入一系列单词,我的反向方法是否有效 我的任务是:编写一个完整的方法,从用户那里读取一系列字符串。用户输入“结束”停止输入单词。然后,按与输入相反的顺序输出字符串。不要输出字符串“end”。Java 使用堆栈反转句子中的单词,java,Java,如果一次输入一系列单词,我的反向方法是否有效 我的任务是:编写一个完整的方法,从用户那里读取一系列字符串。用户输入“结束”停止输入单词。然后,按与输入相反的顺序输出字符串。不要输出字符串“end”。 使用堆栈来完成此任务。仅调用堆栈对象上的push、pop、peek和isEmpty方法 下面是它的运行方式: Enter a word or 'end' to quit: Hello Enter a word or 'end' to quit: Java Enter a word or 'end'
使用堆栈来完成此任务。仅调用堆栈对象上的push、pop、peek和isEmpty方法 下面是它的运行方式:
Enter a word or 'end' to quit: Hello
Enter a word or 'end' to quit: Java
Enter a word or 'end' to quit: World
Enter a word or 'end' to quit: end
You entered (in reverse):
World
Java
Hello
但我的观点是:
Enter a word or 'end' to quit: Hello
Enter a word or 'end' to quit: Java
Enter a word or 'end' to quit: World
Enter a word or 'end' to quit: end
You entered (in reverse): end
以下是我到目前为止的情况:
import java.util.Scanner;
import java.util.Stack;
import java.util.regex.Pattern;
public class Stack1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = "end";
do {
System.out.printf("Enter a word or 'end' to quit: ");
input = scanner.nextLine();
if (input == null || input.length() == 0) {
System.out.println("Invalid! Try again...");
return;
}
} while(!input.equalsIgnoreCase("end"));
String reverse = reverse(input);
System.out.printf("You entered (in reverse): %s", reverse);
}
private static String reverse(String inputString) {
String[] str = inputString.trim().split(Pattern.quote(" "));
Stack stack = new Stack();
for(String input : str) {
stack.push(input);
}
StringBuilder builder = new StringBuilder();
while( !stack.isEmpty()) {
builder.append(stack.pop()).append(" ");
}
return builder.toString();
}
}
每次迭代时,循环都会覆盖
输入。要使其与reverse()
方法一起工作,您需要用空格递增地连接每个单词:
String input = "";
while (true) {
System.out.printf("Enter a word or 'end' to quit: ");
String next = scanner.nextLine();
if (next == null || next.length() == 0) {
System.out.println("Invalid! Try again...");
return;
}
if (next.equalsIgnoreCase("end")) {
break;
}
input += next + " ";
}
或者,您可以直接在循环中填充堆栈并跳过字符串拆分:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Stack<String> stack = new Stack<>();
while (true) {
System.out.printf("Enter a word or 'end' to quit: ");
String next = scanner.nextLine();
if (next == null || next.length() == 0) {
System.out.println("Invalid! Try again...");
return;
}
if (next.equalsIgnoreCase("end")) {
break;
}
stack.push(next);
}
System.out.println("You entered (in reverse):");
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
publicstaticvoidmain(字符串[]args){
扫描仪=新的扫描仪(System.in);
堆栈=新堆栈();
while(true){
System.out.printf(“输入一个单词或“结束”退出:”);
String next=scanner.nextLine();
if(next==null | | next.length()==0){
System.out.println(“无效!请重试…”);
返回;
}
if(next.equalsIgnoreCase(“end”)){
打破
}
stack.push(下一步);
}
System.out.println(“您输入(反向):”;
而(!stack.isEmpty()){
System.out.println(stack.pop());
}
}
请注意,后一种解决方案正确地反转多字输入,而串联方法无法区分行和字。字符串反转=反转(输入)//input=“end”
问题来自这个地方
@托比·斯佩特谢谢你的建议
顺便说一句,我是一个新来的英国人,我很乐意接受任何建议。
我想说的是在遇到问题时学习调试你的程序。在这种情况下,你希望程序向控制台打印一个反向字符串。但是你得到了一个奇怪的答案。现在你需要考虑答案可能来自哪里?
然后在你使用它之前把它打印出来,如下所示
String reverse = reverse(input);//we said you think the problem comes from this place.
System.out.printf("%s%n",input);//this is a key statement to debug--just print it
<>现在,你考虑“代码>输入< /代码>在哪里不是你想要的?然后考虑“代码>输入/代码>从哪里来?继续这样做,然后你可以找到哪里。
你的问题来自于
另一方面,有很多方法需要调试,您可以使用IDE调试您的程序,这样会更高效,而且您还可以使用日志文件等等。您使用的是
do while
循环,这就是为什么要将“end”添加到数组中
要反转字符串,可以使用for
循环,然后自己反转:
StringBuilder reverseStr = new StringBuilder();
for (int i = str.size - 1; i >= 0; i--) {
reverseStr.append(str[i]);
}
或者使用ApacheCommonsLang
StringUtils.reverse()
这是因为您的输入变量只包含“end”。因此,无论何时调用reverse函数,它都只反转结束字符串
代码
import java.util.Scanner;
import java.util.Stack;
public class Stack1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input = "";
Stack stack = new Stack();
while(true){
System.out.printf("Enter a word or 'end' to quit: ");
input = in.next(); // to read a word use next() method.
if(input.equalsIgnoreCase("end")){ break; }
if(!input.equals("")) stack.push(input);
}
System.out.println("You entered (in reverse): ");
while(!stack.isEmpty())
System.out.println(stack.pop());
}
}
似乎在do while循环的每次迭代中都要覆盖
输入
变量。您需要保留已输入的String
值的记录,尽管我不建议在循环中串联字符串,而是使用StringBuilder
,然后在调用反向方法时转换为String
。为什么每个人都建议OP串联字符串?这是错误的。每个输入的单词都应该添加到循环中的堆栈中,就这样。@TimurA。因为原始问题包含了reverse()
的一个实现,该实现需要一个由空格分隔的字符串。我不知道OP为什么要破坏他们自己的帖子。@shmosel我知道它在那里,但我认为我们应该帮助他们做得更好,不是支持一个正确的,而是一个坏的implementation@TimurA. 这就是为什么我在回答中添加了替代解决方案。在这种情况下,您的输出仅在一行中。而不是三行line@wylasr这是OP的reverse()
实现中的一个(容易修复的)技术问题;我认为这不值得细说。我的第二个解决方案没有正确打印。OP不希望反转字符串。虽然这可能是解决问题的一个有价值的提示,但一个好的答案也说明了解决方案。请提供示例代码来说明您的意思。或者,考虑将此写入评论。