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

如何在Java选座程序中处理两位数行号的输入?

问题分析

你的代码报错核心原因是错误处理了多位数行号的输入:

  • 输入10A时,seatchoice.charAt(0)取到字符'1',计算行索引为'1'-'1'=0,完全偏离了目标的第10行;
  • 紧接着seatchoice.charAt(1)取到字符'0','0'-'A'的结果是48-65=-17,直接触发数组索引越界错误。

本质是你默认行号只有1位,没有拆分输入中的数字行号和字母列号,导致逻辑完全失效。

修正方案

以下是修复后的代码片段,同时优化了初始化逻辑和错误处理:

// 需要导入java.util.Arrays
import java.util.Arrays;

// ... 其他代码 ...

if (choice == 'c') {
    input.nextLine();
    String seatchoice = input.nextLine();
    // 初始化座位数组,用Arrays.fill简化赋值
    char[][] seats = new char[13][6];
    for (int i = 0; i < seats.length; i++) {
        Arrays.fill(seats[i], '*');
    }

    // 拆分输入中的数字行号和字母列号
    int splitPos = 0;
    // 找到第一个非数字字符的位置,作为拆分点
    while (splitPos < seatchoice.length() && Character.isDigit(seatchoice.charAt(splitPos))) {
        splitPos++;
    }

    // 转换行号(数组索引从0开始,需减1)
    int row = Integer.parseInt(seatchoice.substring(0, splitPos)) - 1;
    // 转换列号
    char colChar = seatchoice.charAt(splitPos);
    int col = colChar - 'A';

    // 校验索引合法性,避免越界
    if (row >= 0 && row < seats.length && col >= 0 && col < seats[0].length) {
        if (seats[row][col] != 'x') {
            seats[row][col] = 'x';
            System.out.println(" ");
            printSeats(seats);
        } else {
            System.out.println("该座位已被占用");
        }
    } else {
        System.out.println("座位号格式错误或超出范围");
    }
}

// ... 你的printSeats方法保持不变 ...
关键修改说明
  1. 输入拆分逻辑:通过遍历找到数字与字母的分界点,不管行号是1位还是多位,都能准确提取行号数字和列号字母;
  2. 索引合法性校验:增加行、列索引的范围检查,避免非法输入直接导致程序崩溃;
  3. 简化初始化:用Arrays.fill替代手动逐个赋值,代码更简洁;
  4. 错误提示:对已占用座位、非法输入给出明确反馈,提升交互体验。
测试验证

输入10A时,splitPos会定位到2(前两位是数字),substring(0,2)得到"10",转成整数后减1得到数组索引9(对应第10行);colChar为'A',计算得列索引0(对应A列),即可正确将目标座位标记为x。

内容的提问来源于stack exchange,提问作者Cha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:05:24