用ArrayList存日程,Scanner实现命令行增删查;Event类封装title/date/description字段,date用LocalDate确保排序准确;nextInt()后需调用nextLine()清缓冲区;保存用try-with-resources自动关流。

用 ArrayList + Scanner 实现基础日程增删查
Java 初级项目不需要一上来就搞数据库或 Web 界面,先用 ArrayList 存日程文本,配合 Scanner 做命令行交互,能跑通核心逻辑就行。重点不是“多炫”,而是“每行代码都知道它在干什么”。
常见错误是把日期、标题、备注全塞进一个 String,导致后续没法按日期排序或筛选。建议至少拆成独立字段:
-
String title(标题) -
String date(格式统一为"yyyy-MM-dd",避免解析出错) -
String description(可选描述)
封装成一个 Event 类,哪怕只有 getter/setter,也比纯字符串强——后面加提醒功能、重复日程时,结构清晰才能不重写。
按日期排序时 LocalDate 比 String 更可靠
如果用 String 存日期(比如 "2024-1-5"),直接调用 Collections.sort() 会按字典序排,"2024-10-1" 会排在 "2024-2-1" 前面。这不是 bug,是预期行为。
立即学习“Java免费学习笔记(深入)”;
改用 LocalDate 是更稳妥的做法:
LocalDate date = LocalDate.parse("2024-03-15"); // 自动校验格式
// 存入 List 后,用 Comparator:
events.sort(Comparator.comparing(e -> e.getDate()));
注意:LocalDate.parse() 要求输入严格匹配 "yyyy-MM-dd",用户输 "2024/3/15" 会抛 DateTimeParseException。初级项目里,要么提示用户格式,要么加一层 try-catch 并给出友好提示,别让程序直接崩。
Scanner.nextLine() 被 nextInt() / next() 卡住怎么办
这是命令行日程工具最常卡住的地方:用户输入数字选菜单后,紧接着 scanner.nextLine() 返回空字符串。
原因:nextInt() 只读数字,不读后面的换行符 \n,下一次 nextLine() 就立刻读到那个残留的 \n,结果啥也没拿到。
解决方法很简单,在 nextInt() 后加一句 scanner.nextLine(); 吃掉换行符:
System.out.print("请选择操作 (1-添加, 2-查看): ");
int choice = scanner.nextInt();
scanner.nextLine(); // ← 关键:清掉回车
if (choice == 1) {
System.out.print("请输入标题: ");
String title = scanner.nextLine(); // 这次才能正常读
}
退出前保存到文件,但 FileOutputStream 容易漏关流
初级项目常忽略资源释放。用 FileOutputStream 写日程到 schedule.txt,不关流会导致内容没真正写入磁盘,或者下次启动读不到最新数据。
别手写 finally 块关流,用 try-with-resources 最省心:
try (FileWriter writer = new FileWriter("schedule.txt")) {
for (Event e : events) {
writer.write(e.getDate() + "\t" + e.getTitle() + "\n");
}
} catch (IOException e) {
System.err.println("保存失败: " + e.getMessage());
}
注意:这里用 FileWriter 而不是 FileOutputStream,因为写的是文本;如果以后要存二进制或加密内容,再换流类型。另外,路径写相对路径(如 "schedule.txt")就行,别写 C:\...\,否则换电脑就打不开。
日期格式、流关闭、输入缓冲区残留——这三个点看着小,但实际调试时占掉新手 70% 的时间。把它们理清楚,剩下的就是拼逻辑了。










