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

Java中2D ArrayList按姓名搜索显示整行数据报错求助

解决2D ArrayList员工搜索的IndexOutOfBoundsException问题

我来帮你拆解代码里的问题,以及对应的修复方案:

问题1:行索引赋值错误(直接触发越界异常)

你找到匹配姓名时写了row = staffArrayString.get(i).size();,这是核心错误。staffArrayString.get(i).size()返回的是当前行的元素个数(这里每行都是6个元素),但staffArrayString的行索引范围是0到2(总共3行数据)。用6作为行索引去获取元素,必然超出集合范围,直接抛出IndexOutOfBoundsException。

正确的做法是把row赋值为当前的行索引i,也就是找到匹配项的那一行的序号。

问题2:输入读取不完整

你用in.next()读取员工姓名,但员工姓名包含空格(比如"Steven George"),next()只会读取到第一个空格为止,永远无法匹配到完整姓名。应该改用in.nextLine()读取整行输入,支持带空格的内容。

问题3:条件判断的赋值错误

if (found = true)是赋值操作,不是相等判断——这会强制把found设为true,不管实际有没有找到匹配项。正确写法是if (found == true),或者更简洁的if (found)。

问题4:不必要的内层循环

员工姓名是每行的第一个元素,你不需要遍历每行的所有列去查找,直接取每行的第0个元素比较即可,能大幅提升代码效率。

修正后的完整代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class StaffSearch {
    private List<List<String>> staffArrayString;
    private Scanner in;

    public StaffSearch() {
        staffArrayString = new ArrayList<>();
        staffArrayString.add(Arrays.asList("Steven George", "12 York Road", "07123456678", "Permanent", "York", "27000/yr"));
        staffArrayString.add(Arrays.asList("Rina Veyer", "20 Leeds Road", "08987987765", "Part Time", "Leeds", "10/hr"));
        staffArrayString.add(Arrays.asList("Brian Lym", "13 Bradford Road", "07123234345", "Permanent", "Bradford", "27000/yr"));
        in = new Scanner(System.in);
    }

    public void staffNameSearch() {
        System.out.println("Enter name of staff member:");
        // 读取整行输入,支持带空格的姓名
        String staffName = in.nextLine().trim();
        boolean found = false;

        for (int i = 0; i < staffArrayString.size(); i++) {
            // 直接取每行第一个元素(姓名)比较
            if (staffArrayString.get(i).get(0).equals(staffName)) {
                System.out.println("找到匹配的员工信息:");
                System.out.println(staffArrayString.get(i));
                found = true;
                // 找到后直接跳出循环,无需继续搜索
                break;
            }
        }

        if (!found) {
            System.out.println("未找到名为 " + staffName + " 的员工");
        }
    }

    public static void main(String[] args) {
        new StaffSearch().staffNameSearch();
    }
}

额外优化建议

  • 如果需要支持模糊搜索(比如输入"Steven"就能找到"Steven George"),可以把equals改成contains,即staffArrayString.get(i).get(0).contains(staffName)。
  • 长期来看,建议把员工数据封装成Staff实体类,比二维字符串列表更清晰、更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:38:10