import java.time.LocalDateTime
import scala.collection.mutable.ListBuffer
sealed trait TaskStatus
case object Pending extends TaskStatus
case object Completed extends TaskStatus
sealed trait Priority
case object High extends Priority
case object Medium extends Priority
case object Low extends Priority
case class Task(
id: Int,
description: String,
status: TaskStatus = Pending,
priority: Priority = Medium,
createdAt: LocalDateTime = LocalDateTime.now()
)
class TodoManager {
private val tasks = ListBuffer[Task]()
private var nextId = 1
def addTask(description: String, priority: Priority = Medium): Task = {
val task = Task(nextId, description, Pending, priority)
tasks += task
nextId += 1
task
}
def completeTask(id: Int): Option[Task] = {
val taskOpt = tasks.find(_.id == id)
taskOpt match {
case Some(task) =>
val updatedTask = task.copy(status = Completed)
tasks.update(tasks.indexWhere(_.id == id), updatedTask)
Some(updatedTask)
case None => None
}
}
def showAllTasks(): Unit = {
println("\n所有任务:")
printTasks(tasks.toList)
}
def showTasksByStatus(status: TaskStatus): Unit = {
val filtered = tasks.filter(_.status == status).toList
val statusName = status match {
case Pending => "未完成"
case Completed => "已完成"
}
println(s"\n$statusName 任务:")
printTasks(filtered)
}
def showTasksByPriority(): Unit = {
val priorityOrder = Map[Priority, Int](High -> 1, Medium -> 2, Low -> 3)
val sorted = tasks.sortBy(t => (priorityOrder(t.priority), t.createdAt)).toList
println("\n按优先级排序的任务:")
printTasks(sorted)
}
private def printTasks(taskList: List[Task]): Unit = {
if (taskList.isEmpty) {
println("没有任务")
} else {
println("ID\t优先级\t状态\t\t创建时间\t\t\t描述")
println("---------------------------------------------------------------")
taskList.foreach { task =>
val statusStr = task.status match {
case Pending => "未完成"
case Completed => "已完成"
}
val priorityStr = task.priority match {
case High => "高"
case Medium => "中"
case Low => "低"
}
println(s"${task.id}\t$priorityStr\t$statusStr\t${task.createdAt}\t${task.description}")
}
}
}
}
object TodoApp extends App {
val manager = new TodoManager()
manager.addTask("完成Scala作业", High)
manager.addTask("购买 groceries", Low)
manager.addTask("安排会议", Medium)
manager.completeTask(1)
manager.addTask("回复邮件", High)
manager.addTask("阅读技术文档", Medium)
manager.showAllTasks()
manager.showTasksByStatus(Pending)
manager.showTasksByStatus(Completed)
manager.showTasksByPriority()
println("\n欢迎使用待办事项管理器!")
var running = true
while (running) {
println("\n请选择操作:")
println("1. 添加任务")
println("2. 标记任务完成")
println("3. 查看所有任务")
println("4. 查看未完成任务")
println("5. 查看已完成任务")
println("6. 按优先级查看任务")
println("0. 退出")
print("请输入选项: ")
val choice = scala.io.StdIn.readInt()
try {
choice match {
case 1 =>
print("请输入任务描述: ")
val desc = scala.io.StdIn.readLine()
print("请输入优先级(1-高, 2-中, 3-低, 默认中): ")
val prioInput = scala.io.StdIn.readLine()
val priority = prioInput match {
case "1" => High
case "3" => Low
case _ => Medium
}
manager.addTask(desc, priority)
println("任务添加成功!")
case 2 =>
print("请输入要标记完成的任务ID: ")
val id = scala.io.StdIn.readInt()
manager.completeTask(id) match {
case Some(task) => println(s"任务 ${task.id} 已标记为完成")
case None => println("未找到该任务")
}
case 3 => manager.showAllTasks()
case 4 => manager.showTasksByStatus(Pending)
case 5 => manager.showTasksByStatus(Completed)
case 6 => manager.showTasksByPriority()
case 0 => running = false
case _ => println("无效选项")
}
} catch {
case _: NumberFormatException => println("输入无效,请重试")
case e: Exception => println(s"发生错误: ${e.getMessage}")
}
}
println("感谢使用待办事项管理器,再见!")
}