步骤任务:
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
}
}
}
运行结果: