Scala中的case class

Set 去重

import scala.collection.mutable

//定义一个Book类
//实例化两本相同的书,把他们放入Set中(看是否能去重)

class Book(val id: String,val name:String,val stock:Int){
  //判断两个对象是否相等
  override def equals(obj: Any): Boolean = {
    val o = obj.asInstanceOf[Book]
    o.id == id
  }

  //获取 hashCode
  override def hashCode(): Int = {
    id.hashCode
  }

}

//测试类
object Test_caseclass {
  def main(args: Array[String]): Unit = {
    val book1 =new Book(id = "001", name = "红楼梦", stock = 3)
    val book2 =new Book(id = "001", name = "红楼梦", stock = 3)
    val book3 =new Book(id = "001", name = "红楼梦", stock = 6)

//    book1 ==book1
//    book2 ==book1
    println(book1 ==book2)
    //定义一个用来装入书的可变的Set
    val books=mutable.Set[Book]()

    //Set可以去重,但是,它需要去比较两个元素是否相等
    //添加一本书
    books += book1
    books += book2
    books += book3

    println(books)
  }
}

case class 特点

1、创建的对象的属性都是不能被修改的

2、创建对象可以不用写new

3、自动重写方法:toString , equals , hashCode , copy



package scala_mianx

import scala.collection.mutable
package Test_caseclass1 {
  // case class
  //1、创建的对象的属性都是不能被修改的
  //2、创建对象可以不用写new
  //3、自动重写方法:toString , equals , hashCode , copy

  case class Book(val id: String, val name: String, val stock: Int)

  //测试类
  object Test_caseclass {
    def main(args: Array[String]): Unit = {
      val book1 = new Book(id = "001", name = "红楼梦", stock = 3)

      println(book1)
//      book1.id = "002"
      val book2 = new Book(id = "001", name = "红楼梦", stock = 3)
      val book3 = new Book(id = "001", name = "红楼梦", stock = 3)

      //coye 用来复制一份数据
      val book4 = book1.copy(id = "004",name = "西游记")
      //    book1 ==book1
      //    book2 ==book1
      println(book1 == book2)
      //定义一个用来装入书的可变的Set
      val books = mutable.Set[Book]()

      //Set可以去重,但是,它需要去比较两个元素是否相等
      //添加一本书
      books += book1
      books += book2
      books += book3
      books += book4

      println(books)
    }
  }
}

【课后小答】

1、case class 的定义语法是?

case class ClassName(parameter1: Type1, parameter2: Type2, /*...*/)

2、case class 有哪些作用?

数据封装        模式匹配支持        自动生成有用方法

3、case class  的特点有哪些?

        1、创建的对象的属性都是不能被修改的

        2、创建对象可以不用写new

        3、自动重写方法:toString , equals , hashCode , copy

4、case class 和普通的class在哪些方面有区别?

【实训】

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

// 1. 使用case class创建图书信息类Book
case class Book(ID: Int, title: String, author: String, price: Double, quantity: Int)

object BookOperations {
    def main(args: Array[String]) {
        // 2. 创建一个名为BookList的可变List,它只能用来保存Book的实例
        import scala.collection.mutable.ListBuffer
        var BookList: ListBuffer[Book] = ListBuffer[Book]()

        // 3. 初始化三本不同的书,加入到Booklist中
        val book1 = Book(1, "Scala编程之道", "张三", 55.0, 3)
        val book2 = Book(2, "Java进阶之路", "李四", 65.0, 2)
        val book3 = Book(3, "Python实战指南", "王五", 45.0, 5)

        BookList += book1
        BookList += book2
        BookList += book3

        // 4. 添加一本已经存在的书,修改Booklist中对应书目的数量
        val existingBook = Book(1, "Scala编程之道", "张三", 55.0, 2)
        addExistingBook(existingBook, BookList)

        // 5. 根据图书名称查询是否在列表中
        val searchTitle = "Java进阶之路"
        val isInListByName = isBookInListByName(searchTitle, BookList)
        println(s"图书 '$searchTitle' 是否在列表中: $isInListByName")

        // 6. 删除指定书名的书
        val bookToDeleteByName = "Python实战指南"
        deleteBookByName(bookToDeleteByName, BookList)

        // 7. 删除指定ID的书
        val bookToDeleteByID = 2
        deleteBookByID(bookToDeleteByID, BookList)

        // 8. 对于图书按价格从高到低排序
        val sortedBooks = sortBooksByPriceDesc(BookList)

        // 9. 遍历图书列表,并打印每本书的详细信息
        println("排序后的图书列表详细信息:")
        sortedBooks.foreach(book => println(book))

        // 10. 展示全部的总的金额
        val totalAmount = calculateTotalAmount(sortedBooks)
        println(s"全部图书的总金额: $totalAmount")
    }

    // 辅助方法:添加一本已经存在的书,修改数量
    def addExistingBook(existingBook: Book, bookList: ListBuffer[Book]): Unit = {
        bookList.find(_.ID == existingBook.ID) match {
            case Some(book) =>
                val updatedBook = book.copy(quantity = book.quantity + existingBook.quantity)
                bookList -= book
                bookList += updatedBook
            case None =>
                bookList += existingBook
        }
    }

    // 辅助方法:根据图书名称查询是否在列表中
    def isBookInListByName(title: String, bookList: ListBuffer[Book]): Boolean = {
        bookList.exists(_.title == title)
    }

    // 辅助方法:删除指定书名的书
    def deleteBookByName(title: String, bookList: ListBuffer[Book]): Unit = {
        bookList -= bookList.find(_.title == title).get
    }

    // 辅助方法:删除指定ID的书
    def deleteBookByID(ID: Int, bookList: ListBuffer[Book]): Unit = {
        bookList -= bookList.find(_.ID == ID).get
    }

    // 辅助方法:对图书按价格从高到低排序
    def sortBooksByPriceDesc(bookList: ListBuffer[Book]): ListBuffer[Book] = {
        bookList.sortBy(-_.price)
    }

    // 辅助方法:计算全部图书的总金额
    def calculateTotalAmount(bookList: ListBuffer[Book]): Double = {
        bookList.map(book => book.price * book.quantity).sum
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/915377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录

基本概念 RTL(Register - Transfer - Level)视图:是一种硬件描述语言的抽象层次,用于描述数字电路中寄存器之间的数据传输和操作。在这个层次上,可以看到电路的基本结构,如寄存器、组合逻辑、多路复用器等…

react的创建与书写

一:创建项目 超全面详细一条龙教程!从零搭建React项目全家桶(上篇) - 知乎 1.创建一个文件夹,shift鼠标右键选择在此处打开powershell 2.为了加速npm下载速度,先把npm设置为淘宝镜像地址。 npm config s…

【动态规划】两个数组的 dp 问题

1. 最长公共子序列 1143. 最长公共子序列 状态表示: dp[i][j] 表示 s1 的 0 ~ i 区间和 s2 的 0 ~ j 区间内所有子序列中,最长公共子序列的长度 状态转移方程: 当 s1[i] 和 s2[j] 相等时,那么最长公共子序列一定是以这两个位置…

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理,请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注:本文基于《计算机网络》(第5版)吴功宜、吴英…

nacos集群部署与配置

Nacos集群模式 1. 预备环境准备 请确保是在环境中安装使用: 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。64 bit JDK 1.8;下载. 配置。Maven 3.2.x;下载. 配置。3个或3个以上Nacos节点才能构成集群 ubuntu中假如没安装jdk,则…

Python学习从0到1 day26 第三阶段 Spark ③ 数据计算 Ⅱ

目录 一、Filter方法 功能 语法 代码 总结 filter算子 二、distinct方法 功能 语法 代码 总结 distinct算子 三、SortBy方法 功能 语法 代码 总结 sortBy算子 四、数据计算练习 需求: 解答 总结 去重函数: 过滤函数: 转换函数: 排…

Jmeter基础篇(23)TPS和QPS的异同

前言 这是一篇性能测试指标的科普文章哦! TPS和QPS是同一个概念吗? TPS(Transactions Per Second)和QPS(Queries Per Second)虽然都是衡量系统性能的指标,但是它们并不是同一个概念。这两个各…

IEC60870-5-104 协议源码架构详细分析

IEC60870-5-104 协议源码架构 前言一、资源三、目录层级一二、目录层级二config/lib60870_config.hdependencies/READMEexamplesCMakeLists.txtcs101_master_balancedcs104_client_asyncmulti_client_servertls_clienttls_server说明 make这些文件的作用是否需要导入这些文件&a…

机器学习在网络安全中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 机器学习在网络安全中的应用 机器学习在网络安全中的应用 机器学习在网络安全中的应用 引言 机器学习概述 定义与原理 发展历程 …

JUC基础类-AbstractQueuedSynchronizer

AbstractQueuedSynchronizer 1、AbstractQueuedSynchronizer概述2、AbstractQueuedSynchronizer源码分析2.1 AQS源码2.2 Node类 如有侵权,请联系~ 如有问题,也欢迎批评指正~ 1、AbstractQueuedSynchronizer概述 AbstractQueuedSy…

文献阅读 | Nature Methods:使用 STAMP 对空间转录组进行可解释的空间感知降维

文献介绍 文献题目: 使用 STAMP 对空间转录组进行可解释的空间感知降维 研究团队: 陈金妙(新加坡科学技术研究局) 发表时间: 2024-10-15 发表期刊: Nature Methods 影响因子: 36.1&#xff0…

Redis系列之底层数据结构ZipList

Redis系列之底层数据结构ZipList 实验环境 Redis 6.0 什么是Ziplist? Ziplist,压缩列表,这种数据结构会根据存入数据的类型和大小,分配大小不同的空间,所以是为了节省内存而采用的。因为这种数据结构是一种完整连续…

界面控件DevExpress WPF中文教程:TreeList视图及创建分配视图

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

数据结构中数据有序性/ 单调性 ——二分查找

以下记录的都是闭区间写法 例题&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 1.关系转换 寻找目标值有四种情况&#xff1a;≥、>、≤、< 比如目标值x&#xff0c; 可以转化为 ≥x、≥ x1、≤x、≤ x1 比如数组大小为6&#xff0c;目标值为…

探索Python的HTTP利器:Requests库的神秘面纱

文章目录 **探索Python的HTTP利器&#xff1a;Requests库的神秘面纱**一、背景&#xff1a;为何选择Requests库&#xff1f;二、Requests库是什么&#xff1f;三、如何安装Requests库&#xff1f;四、Requests库的五个简单函数使用方法1. GET请求2. POST请求3. PUT请求4. DELET…

《Linux从小白到高手》综合应用篇:深入详解Linux swap及其调整优化

1. 引言&#xff1a; Swap是存储设备上的一块空间&#xff08;分区&#xff09;&#xff0c;操作系统可以在这里暂存一些内存里放不下的东西。这从某种程度上相当于增加了服务器的可用内存。虽然从swap读写比内存慢&#xff0c;但总比没有好&#xff0c;算是内存不足时一种比较…

SpringMVC学习笔记(一)

一、SpringMVC的基本概念 &#xff08;一&#xff09;三层架构和MVC 1、三层架构概述 我们的开发架构一般都是基于两种形式&#xff0c;一种是 C/S 架构&#xff0c;也就是客户端/服务器&#xff0c;另一种是 B/S 架构&#xff0c;也就是浏览器服务器。在 JavaEE 开发中&…

小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程

一、概述 【软件资源文件下载在文章最后】 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程 点餐软件以其实用的功能和简便的操作&#xff0c;为小型餐饮店提供了高效的点餐管理解决方案&#xff0c;提高了工作效率和服务质量 ‌点餐管理‌&#xff1a;支持电…

【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--角色可访问接口管理

咱们继续来编写孢子记账的简易权限&#xff0c;这篇文章中我们将编写角色可访问接口的管理API&#xff0c;同样我不会把完整的代码全都列出来&#xff0c;只会列出部分代码&#xff0c;其余代码我希望大家能自己手动编写&#xff0c;然后对比项目代码。废话不多说&#xff0c;开…

Linux上Python使用MySQLdb包连接MySQL5.7和MySQL8的问题

在一台安装有MySQL8的Linux上用MySQLdb包连接MySQL5.7&#xff0c;连接参数中加上ssl_mode‘DISABLED’,能正常连接&#xff1b;不加ssl_mode参数&#xff0c;会报 而在连接MySQL8时加不加ssl_mode都能正常连接&#xff0c;但在使用过程&#xff0c;加了ssl_mode参数&#xff…