编辑代码

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

// Task类定义
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("感谢使用待办事项管理器,再见!")
}