Java14下如何分类关联定位文本读取后存入ArrayList的对应员工条目
员工层级映射实现方案(Java14适配)
基础实体适配Java14语法
- 利用Java14正式引入的
record类型定义员工实体,省去冗余的getter、equals、构造器代码,直接匹配文本读取的三个字段:
// 员工实体:字段为姓名、年龄、所属部门 public record Employee(String name, int age, String department) {}
- 文本读取逻辑无需改动:逐行剥离每行首尾的
|和多余空格,按分号切分字段后直接存入原有15个元素规模的ArrayList<Employee> allEmployees即可。
部门-员工的分层关联结构
- 无需硬存元素原始索引,使用
Map<String, List<Employee>>构建层级映射即可,这种结构下子列表的元素和原总ArrayList中的元素是同一对象引用,不存在关联错位问题:- Map的键为部门名称(Floral、Meat、Dairy)
- Map的值为对应部门下的员工子列表
- 基于原有总ArrayList直接生成分组映射,可直接用Java14兼容的Stream API实现:
// 按部门字段自动分组,得到部门到员工子列表的映射 Map<String, List<Employee>> deptEmployeeMap = allEmployees.stream() .collect(Collectors.groupingBy(Employee::department));
- 由于每个部门固定对应5名员工,15条数据的分组操作无性能损耗,执行耗时可忽略。
交互流程的关联逻辑
- 部门选择环节:预先定义部门的展示顺序列表,避免Map遍历键时顺序不稳定的问题:
用户输入序号n时,通过// 固定部门展示顺序,对应交互提示的1/2/3序号 List<String> deptOrder = List.of("Floral", "Meat", "Dairy");deptOrder.get(n-1)拿到对应部门名称,再从deptEmployeeMap中取出该部门下的员工子列表。 - 员工选择环节:将取出的部门员工子列表按索引顺序展示序号,用户输入序号m时,直接通过
deptEmployeeMap.get(选中部门名).get(m-1)拿到对应员工实体——这个实体和原总ArrayList中的元素是同一内存引用,不存在数据拷贝、副本错位的问题,直接读取字段就能输出完整详情,完全不需要反向查找原始ArrayList的索引。
常见坑点规避
- 不要硬编码存储每个员工在原ArrayList中的索引:一旦后续调整总列表顺序、增删元素,硬存的索引会直接失效,轻则选错员工,重则抛出数组越界异常。
- 员工选择环节的输入校验仅需判断输入数字是否在
[1, 部门员工子列表长度]区间即可,由于每个部门固定5名员工,子列表长度恒为5,校验逻辑非常简单。
内容的提问来源于stack exchange,提问作者sdoodle
相关产品推荐
相关产品推荐

