You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:29:15