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

如何在不使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:22:46