RedBlackBST打印异常:两种输入方式均在首循环后终止
排查红黑树程序循环卡住的问题
首先,咱们来逐个分析你两个main方法里的问题,以及终端操作的误区:
1. 用StdIn的版本:输入未正确终止
你遇到的卡住问题,核心是**StdIn.isEmpty()在终端输入时会一直等待EOF(文件结束符)**,而你输入完"t a l l t r e e s"后按了^Z——这在Linux里是暂停进程,不是发送EOF。程序其实还在等待更多输入,根本没退出第一个for循环。
修复&排查方向:
- 输入完内容后,按
Ctrl+D(Linux/macOS)发送EOF,这样StdIn.isEmpty()会返回true,循环才会退出,执行后面的输出逻辑。 - 如果你不想依赖EOF,也可以修改循环逻辑,指定一个终止关键词(比如输入
"exit"就停止读取):for (int i = 0; !StdIn.isEmpty(); i++) { String key = StdIn.readString(); if (key.equals("exit")) break; st.put(key, i); }
2. 用Scanner的版本:重复读取导致逻辑错误
这个版本的问题更明显:
- 你在for循环条件里调用了
input.nextLine(),循环体里又调用了一次input.nextLine(),每次循环会读取两行输入。当你只输入一行后,程序会卡在第二次input.nextLine()等待下一行输入,所以看起来“停止执行”。 - 另外,
input.nextLine() != ""的判断方式也不对,字符串相等应该用equals(),空行判断应该用line.isEmpty()。
修复&排查方向:
改成先读取一行,再处理内容,同时支持一行输入多个key(和你输入的"t a l l t r e e s"格式匹配):
public static void main(String[] args) { RedBlackBST<String, Integer> st = new RedBlackBST<>(); Scanner input = new Scanner(System.in); int i = 0; while (input.hasNextLine()) { String line = input.nextLine(); // 输入空行就停止读取 if (line.isEmpty()) { break; } // 按空格分割一行里的多个key String[] keys = line.split("\\s+"); for (String key : keys) { st.put(key, i++); } } input.close(); // 后续输出逻辑 for (String s : st.keys()){ System.out.println(s + " " + st.get(s)); } st.delete("t"); System.out.println(st.keys()); }
3. 终端操作的误区
你输入完内容后按^Z,这会把程序暂停到后台(看终端输出里的[1]+ Stopped),不是让程序结束输入。正确的结束终端输入应该用Ctrl+D(Linux/macOS),Windows环境下可以用Ctrl+Z。
内容的提问来源于stack exchange,提问作者kyle ploy
相关产品推荐
相关产品推荐

