如果我一次输入一系列单词,我的反向方法是否有效?
我的任务是:编写一个完整的方法,从用户那里读取一系列字符串。用户输入"结束"停止输入单词。然后,按照输入方式的相反顺序输出字符串。不要输出字符串“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();
}
}
答案 0 :(得分:1)
弹出堆栈直到堆栈变空。
的代码强>
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());
}
}
答案 1 :(得分:0)
你的循环在每次迭代时都会覆盖input
。为了使其与您的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());
}
}
请注意,后一种解决方案正确地反转了多字输入,而连接方法无法区分线条和单词。
答案 2 :(得分:0)
String reverse = reverse(input);//input="end"
问题来自这个地方
@Toby Speight感谢您的建议。
顺便说一下,我是英国新人,我很高兴接受任何建议。 我想说的是在你遇到问题时学习调试你的程序。在这种情况下:你希望程序打印一个反向的字符串到控制台。但你有一个奇怪的答案。现在你需要考虑在哪里答案可能来自? 然后在使用之前打印它,如下所示
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
现在你然后考虑input
不在你想要的地方?然后只考虑input
来自哪里?继续这样做,然后你就可以找到它
你的问题来自。
另一方面,有很多方法需要调试,你可以使用IDE调试你的程序,它会更高效,你可以使用日志文件等等。
答案 3 :(得分:0)
这是因为您的输入变量仅包含&#34; end&#34;。因此,无论何时调用反向函数,它只会反转结束字符串。
答案 4 :(得分:-1)
您正在使用do-while
循环,这就是为什么&#34;结束&#34;被添加到数组中。
要反转字符串,您可以使用for
循环并自行反转:
StringBuilder reverseStr = new StringBuilder();
for (int i = str.size - 1; i >= 0; i--) {
reverseStr.append(str[i]);
}
或使用类似Apache Commons Lang StringUtils.reverse()
的内容。