scala中的case class练习题

33 阅读3分钟

步骤任务:

1. 使用case class创建图书信息类Book:包含四个属性:ID,书名,作者,价格,数量。

2. 创建一个名为bookList的可变List,它只能用来保存Book的实例。

3. 初始化三本不同的书(注意id不同就是不同的书),加入到bookList中。

4. 添加一本已经存在的书。此时应该去修改bookList中对应书目的数量,而不是去添加一条新数据。

5. 根据图书名称查询是否在列表中(通过遍历列表对比名称)

6. 删除指定书名的书

7. 删除指定ID的书

8. 对于图书按价格从高到低排序。

9. 遍历图书列表,并打印每本书的详细信息

10. 计算全部总的金额

代码示范:

package caseclass

/**
 * 步骤任务:
 * 1.使用case class创建图书信息类Book:包含四个属性:ID,书名,作者,价格,数量。
 * 2.创建一个名为bookList的可变List,它只能用来保存Book的实例。
 * 3.初始化三本不同的书(注意id不同就是不同的书),加入到bookList中。
 * 4.添加一本已经存在的书。此时应该去修改bookList中对应书目的数量,而不是去添加一条新数据。
 * 5.根据图书名称查询是否在列表中(通过遍历列表对比名称)
 * 6.删除指定书名的书
 * 7.删除指定ID的书
 * 8.对于图书按价格从高到低排序。
 * 9.遍历图书列表,并打印每本书的详细信息
 * 10.计算全部总的金额
 */
object exercise01{
  // 1. 创建图书样例类
  case class Book(id: String, name: String, author: String, price: Double, amount: Int)

  def main(args: Array[String]): Unit = {
    // 2. 创建可变ListBuffer保存Book实例
    val bookList = scala.collection.mutable.ListBuffer[Book]()

    // 3. 初始化三本不同的书并加入列表
    val book1 = Book("1", "凡人修仙传", "忘语", 80.5, 10)
    val book2 = Book("2", "三国演义", "罗贯中", 88.0, 8)
    val book3 = Book("3", "西游记", "吴承恩", 66.0, 6)
    bookList ++= List(book1, book2, book3)

    println("=== 初始图书列表 ===")
    printBookList(bookList)

    // 4. 添加一本已存在的书(修改数量而非新增)
    println("\n=== 添加已存在的图书(ID=1) ===")
    val existingBook = Book("1", "凡人修仙传", "忘语", 80.5, 5) // 新增5本
    addOrUpdateBook(bookList, existingBook)
    printBookList(bookList)

    // 5. 根据图书名称查询是否存在
    println("\n=== 查询图书名称是否存在 ===")
    val bookNameToFind = "三国演义"
    val isExist = checkBookExist(bookList, bookNameToFind)
    println(s"图书《$bookNameToFind》是否存在:$isExist")

    // 6. 删除指定书名的书
    println("\n=== 删除指定书名的图书(西游记) ===")
    val bookNameToDelete = "西游记"
    deleteBookByName(bookList, bookNameToDelete)
    printBookList(bookList)

    // 7. 删除指定ID的书
    println("\n=== 删除指定ID的图书(ID=2) ===")
    val bookIdToDelete = "2"
    deleteBookById(bookList, bookIdToDelete)
    printBookList(bookList)

    // 重新添加一些图书用于排序演示
    bookList += Book("4", "红楼梦", "曹雪芹", 98.0, 4)
    bookList += Book("5", "水浒传", "施耐庵", 78.5, 7)
    println("\n=== 添加新图书后列表 ===")
    printBookList(bookList)

    // 8. 按价格从高到低排序(修正排序语法)
    println("\n=== 按价格从高到低排序 ===")
    val sortedBooks = sortBooksByPriceDesc(bookList)
    printBookList(sortedBooks)

    // 10. 计算全部总金额
    println("\n=== 计算全部图书总金额 ===")
    val totalAmount = calculateTotalAmount(bookList)
    println(f"全部图书总金额:¥$totalAmount%.2f")
  }

  /**
   * 4. 添加图书(存在则更新数量,不存在则新增)
   * @param list 图书列表
   * @param book 要添加的图书
   */
  def addOrUpdateBook(list: scala.collection.mutable.ListBuffer[Book], book: Book): Unit = {
    // 查找是否存在相同ID的图书
    list.find(_.id == book.id) match {
      case Some(existBook) =>
        // 存在则更新数量(原数量 + 新数量)
        val index = list.indexOf(existBook)
        list.update(index, existBook.copy(amount = existBook.amount + book.amount))
      case None =>
        // 不存在则新增
        list += book
    }
  }

  /**
   * 5. 根据图书名称查询是否存在
   * @param list 图书列表
   * @param bookName 要查询的图书名称
   * @return 是否存在
   */
  def checkBookExist(list: scala.collection.mutable.ListBuffer[Book], bookName: String): Boolean = {
    // 遍历列表对比名称(忽略大小写)
    list.exists(book => book.name.equalsIgnoreCase(bookName))
  }

  /**
   * 6. 删除指定书名的图书
   * @param list 图书列表
   * @param bookName 要删除的图书名称
   */
  def deleteBookByName(list: scala.collection.mutable.ListBuffer[Book], bookName: String): Unit = {
    list --= list.filter(_.name.equalsIgnoreCase(bookName))
  }

  /**
   * 7. 删除指定ID的图书
   * @param list 图书列表
   * @param bookId 要删除的图书ID
   */
  def deleteBookById(list: scala.collection.mutable.ListBuffer[Book], bookId: String): Unit = {
    list --= list.filter(_.id == bookId)
  }

  /**
   * 8. 按价格从高到低排序(兼容所有Scala版本的写法)
   * @param list 图书列表
   * @return 排序后的不可变List
   */
  def sortBooksByPriceDesc(list: scala.collection.mutable.ListBuffer[Book]): List[Book] = {
    // 修正方案1:使用reverse方法(最通用)
    list.toList.sortBy(_.price).reverse

    // 修正方案2:使用Ordering的reverse方法(另一种兼容写法)
    // list.toList.sortBy(_.price)(Ordering[Double].reverse)
  }

  /**
   * 9. 打印图书列表详情
   * @param books 图书列表(支持可变和不可变List)
   */
  def printBookList(books: Traversable[Book]): Unit = {
    books.foreach { book =>
      println(s"ID:${book.id} | 书名:${book.name} | 作者:${book.author} | 单价:¥${book.price} | 数量:${book.amount}")
    }
  }

  /**
   * 10. 计算全部图书总金额(单价 * 数量 求和)
   * @param list 图书列表
   * @return 总金额
   */
  def calculateTotalAmount(list: scala.collection.mutable.ListBuffer[Book]): Double = {
    list.foldLeft(0.0) { (total, book) =>
      total + book.price * book.amount
    }
  }
  }

运行结果:

屏幕截图 2025-12-03 154918.png

屏幕截图 2025-12-03 154935.png