scala的case class练习题

28 阅读4分钟

题目如下

  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 caseclass03 {
  // 1. 定义Book样例类(保留你写的anthor命名)
  case class Book(id: String, name: String, anthor: String, price: Double, amount: Int)

  def main(args: Array[String]): Unit = {
    // 2. 创建可变ListBuffer并初始化3本书
    val book1 = Book("1", "凡人修仙传", "忘语", 80.5, 10)
    val book2 = Book("2", "霸道总裁爱上我", "忘语1", 50.0, 9)
    val book3 = Book("3", "重生之我的十八岁太奶", "忘语", 20.0, 5)
    val bookList = scala.collection.mutable.ListBuffer(book1, book2, book3)

    println("=== 初始化后的图书列表 ===")
    printBookList(bookList) // 9. 遍历打印

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

    // 5. 根据图书名称查询是否存在
    println("\n=== 5. 按书名查询 ===")
    val queryName1 = "凡人修仙传"
    val queryName2 = "不存在的书"
    println(s"查询《$queryName1》:${if (checkBookExist(bookList, queryName1)) "存在" else "不存在"}")
    println(s"查询《$queryName2》:${if (checkBookExist(bookList, queryName2)) "存在" else "不存在"}")

    // 6. 删除指定书名的书
    println("\n=== 6. 删除指定书名的书(霸道总裁爱上我) ===")
    deleteBookByName(bookList, "霸道总裁爱上我")
    printBookList(bookList)

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

    // 重新添加数据用于排序演示
    bookList += Book("2", "霸道总裁爱上我", "忘语1", 50.0, 9)
    bookList += Book("3", "重生之我的十八岁太奶", "忘语", 20.0, 5)
    println("\n=== 重新补充数据后 ===")
    printBookList(bookList)

    // 8. 按价格从高到低排序(使用修复后的方法)
    println("\n=== 8. 按价格从高到低排序 ===")
    val sortedBooks = sortBooksByPriceDesc(bookList)
    sortedBooks.foreach(ele => {
      println(s"${ele.id} ${ele.name} ${ele.anthor} ${ele.price} ${ele.amount}")
    })

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

  // 4. 封装:添加图书(存在则更新数量,不存在则新增)
  def addOrUpdateBook(bookList: scala.collection.mutable.ListBuffer[Book], newBook: Book): Unit = {
    // 遍历查找ID相同的书
    val index = bookList.indexWhere(_.id == newBook.id)
    if (index != -1) {
      // 存在则更新数量
      val oldBook = bookList(index)
      bookList.update(index, oldBook.copy(amount = oldBook.amount + newBook.amount))
    } else {
      // 不存在则新增
      bookList += newBook
    }
  }

  // 5. 封装:按书名查询是否存在(遍历对比名称,符合题目要求)
  def checkBookExist(bookList: scala.collection.mutable.ListBuffer[Book], name: String): Boolean = {
    var exist = false
    for (book <- bookList if !exist) {
      if (book.name == name) {
        exist = true
      }
    }
    exist
  }

  // 6. 封装:删除指定书名的书
  def deleteBookByName(bookList: scala.collection.mutable.ListBuffer[Book], name: String): Unit = {
    bookList --= bookList.filter(_.name == name)
  }

  // 7. 封装:删除指定ID的书
  def deleteBookById(bookList: scala.collection.mutable.ListBuffer[Book], id: String): Unit = {
    bookList --= bookList.filter(_.id == id)
  }

  // 8. 封装:按价格从高到低排序(修复reverse报错问题,兼容所有Scala版本)
  def sortBooksByPriceDesc(bookList: scala.collection.mutable.ListBuffer[Book]): List[Book] = {
    // 修复核心:使用 Ordering[Double].reverse 替代 Ordering.Double.reverse
    bookList.sortBy(_.price)(Ordering[Double].reverse).toList
    // 可选简化写法(二选一,效果相同):
    // bookList.sortWith((a, b) => a.price > b.price).toList
  }

  // 9. 封装:遍历打印图书列表(复用你的打印格式)
  def printBookList(bookList: scala.collection.mutable.ListBuffer[Book]): Unit = {
    bookList.foreach(ele => {
      println(s"${ele.id} ${ele.name} ${ele.anthor} ${ele.price} ${ele.amount}")
    })
  }

  // 10. 封装:计算总金额(价格 * 数量)
  def calculateTotalAmount(bookList: scala.collection.mutable.ListBuffer[Book]): Double = {
    var total = 0.0
    for (book <- bookList) {
      total += book.price * book.amount
    }
    total
  }
}