Java中如何在ArrayList内检索指定编号项目并修改截止日期
项目截止日期修改功能的正确实现方案
基础结构约定
该功能的实现完全依托现有两个类的设计,首先要保证基础结构满足修改要求:
NewProject实体类:所有私有属性必须配套对应的公开访问方法,核心需要包含项目编号getProjNum()、项目截止日期getDeadline()、setDeadline()三个方法,禁止把类内属性直接设为public暴露。ProjectOptions容器类:内部维护的ArrayList<NewProject>集合是所有项目实例的唯一存储入口,不对外直接返回集合的引用,避免外部绕过类逻辑直接修改集合内容。
核心实现流程
完整的修改逻辑按照以下步骤落地即可正常运行:
- 接收用户输入的待修改项目编号,先做入参非空校验,排除空值、空字符串的非法输入
- 遍历容器内维护的项目集合,匹配和输入项目编号内容完全一致的项目实例
- 根据检索结果做分支处理:
- 未匹配到目标项目:直接向用户返回“对应编号的项目不存在”的提示,终止流程
- 匹配到目标项目:先展示当前项目的原截止日期,再接收用户输入的新截止日期值,校验日期格式、逻辑合法性(比如不能设为早于当前日期的过去时间)
- 校验通过的新截止日期值,直接调用已匹配到的项目实例的
setDeadline()方法完成属性修改,修改完成后回读属性值做二次校验,确认修改生效后向用户反馈结果。
容易导致功能失效的常见缺陷
- 字符串匹配错误:检索项目时,用
==运算符比较两个字符串类型的项目编号,因为Java中字符串==比较的是对象内存地址而非实际存储的内容,会出现明明编号相同却匹配失败的问题,正确的比较方式是用inputProjNum.equals(project.getProjNum())做内容比对。 - 修改对象错误:检索到匹配项后,没有直接操作集合中存储的原项目实例,而是重新new了一个新的
NewProject对象去修改截止日期,新对象的属性改动完全不会同步到原集合中,自然无法实现修改效果。 - 封装不满足要求:
NewProject类的截止日期属性是私有访问权限,却没有对外提供对应的setter方法,外部代码拿到项目实例后根本无法对属性赋值。 - 非法值无拦截:接收到用户输入的新截止日期后,没有做格式校验,直接把字符串值塞进属性里,后续读取数据时会出现类型不匹配、解析报错的问题。
核心方法代码参考
// ProjectOptions类内部封装的修改方法 private List<NewProject> projectList = new ArrayList<>(); public boolean updateDeadlineByProjNum(String inputProjNum, String newDeadline) { // 入参合法性校验 if (inputProjNum == null || inputProjNum.isBlank() || newDeadline == null || newDeadline.isBlank()) { return false; } // 遍历检索匹配项目 for (NewProject project : projectList) { if (inputProjNum.equals(project.getProjNum())) { try { // 解析校验日期格式 LocalDate parsedDeadline = LocalDate.parse(newDeadline, DateTimeFormatter.ofPattern("yyyy-MM-dd")); // 直接修改集合中原实例的属性 project.setDeadline(parsedDeadline); return true; } catch (DateTimeParseException e) { // 日期格式不合法直接返回失败 return false; } } } // 遍历完成未找到匹配项目 return false; }
性能优化提示:如果后续项目存储规模较大、项目编号全局唯一,可以将ArrayList结构替换为
HashMap<String, NewProject>,以项目编号为key存储实例,能把检索的时间复杂度从O(n)降到O(1),大幅提升查询速度。
内容的提问来源于stack exchange,提问作者Kevin Marais
相关产品推荐
相关产品推荐

