如何在不使用StandardInputRead的情况下更新对象数组指定元素?
替换StandardInputRead为Java标准输入实现任务更新方法
用Java标准库的Scanner类替代自定义的StandardInputRead即可满足老师要求,同时保留你原本的「输入null/0保留原值」业务逻辑,以下是修改后的完整实现:
首先需要导入必要的类:
import java.util.Scanner; import java.text.SimpleDateFormat; import java.text.ParseException; import java.util.Date;
修改后的updateTask方法:
private void updateTask(String tID, String title, Date newFrom, Date newTo, status stat) { Scanner scanner = new Scanner(System.in); int i = -1; displayTasks(); // 读取并验证任务索引(确保是有效正整数,且在数组范围内) while (i < 0 || i >= projectTasks.length) { System.out.print("Give task's index: "); if (scanner.hasNextInt()) { i = scanner.nextInt(); scanner.nextLine(); // 清除输入缓冲区的换行符 if (i < 0 || i >= projectTasks.length) { System.out.println("无效索引,请输入列表范围内的正整数。"); } } else { System.out.println("请输入有效的正整数。"); scanner.nextLine(); // 清除无效输入内容 } } if (projectTasks[i] != null) { System.out.println("仅提交你想要修改的字段,其他情况请输入'null'保留原值。"); // 处理任务ID输入 System.out.print("Change the task's ID: "); String inputTID = scanner.nextLine().trim(); if (!inputTID.equalsIgnoreCase("null")) { tID = inputTID; } else { tID = projectTasks[i].getTaskID(); // 保留原有ID } projectTasks[i].setTaskID(tID); // 处理任务标题输入 System.out.print("Change the task's title: "); String inputTitle = scanner.nextLine().trim(); if (!inputTitle.equalsIgnoreCase("null")) { title = inputTitle; } else { title = projectTasks[i].getTaskTitle(); // 保留原有标题 } projectTasks[i].setTaskTitle(title); // 处理开始日期输入 System.out.print("Edit the starting date (DD/MM/YY): "); String inputFrom = scanner.nextLine().trim(); if (!inputFrom.equalsIgnoreCase("null")) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy"); try { newFrom = sdf.parse(inputFrom); } catch (ParseException e) { System.out.println("日期格式无效,将保留原开始日期。"); newFrom = projectTasks[i].getTaskFromDate(); } } else { newFrom = projectTasks[i].getTaskFromDate(); // 保留原有开始日期 } projectTasks[i].setTaskFromDate(newFrom); // 处理截止日期输入 System.out.print("Edit the submission date (DD/MM/YY): "); String inputTo = scanner.nextLine().trim(); if (!inputTo.equalsIgnoreCase("null")) { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy"); try { newTo = sdf.parse(inputTo); } catch (ParseException e) { System.out.println("日期格式无效,将保留原截止日期。"); newTo = projectTasks[i].getTaskEndDate(); } } else { newTo = projectTasks[i].getTaskEndDate(); // 保留原有截止日期 } projectTasks[i].setTaskEndDate(newTo); // 注:如果status字段需要修改,可参考上述逻辑添加输入处理 // stat = ... 此处根据需求补充逻辑 // projectTasks[i].setStatus(stat); // 原代码中重新new Task的操作可以移除,直接修改原有对象属性即可 // projectTasks[i] = new Task(tID, title, newFrom, newTo, stat); } else { System.out.println("列表中没有该任务。"); } scanner.close(); // 关闭Scanner资源 }
关键改动说明
- 替换输入工具:用
java.util.Scanner替代自定义的StandardInputRead,这是Java官方提供的标准控制台输入类,符合老师要求。 - 保留原值逻辑:对每个字段的输入进行判断,若用户输入
null(不区分大小写),则直接复用原有任务对象的对应属性值,否则使用新输入的值。 - 输入验证:针对任务索引添加了范围校验,避免数组越界;针对日期输入添加了解析异常处理,格式错误时自动保留原日期。
- 资源管理:使用完毕后关闭
Scanner,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Barbara Riga
相关产品推荐
相关产品推荐

