第7章 Scala集合

第7章 Scala集合

7.1 简介

image

image

  • scala.collection.immutable

    image

  • scala.collection.mutable

    image

7.2 数组

image

  1. 不可变数组

    package chapter07object Test01_ImmutableArray {def main(args: Array[String]): Unit = {// 1. 创建数组val arr: Array[Int] = new Array[Int](10)arr(9) = 9println(arr.mkString(","))// 另一种创建方式val arr2 = Array[Int](1, 2, 3, 4, 65)// 2. 数组操作-(由于是不可变数组,增删不能改变)改查// 访问元素println(arr2.mkString(","))arr2(0) = 100println(arr2.apply(0))arr2.update(0, 199)println(arr2.mkString(","))// 3. 数组的遍历// for循环for (i <- arr2.indices) {println(arr2(i))}// 增强for循环for (ele <- arr2) {println(ele)}// 迭代器val iterator: Iterator[Int] = arr2.iteratorprintln("++++++++++迭代器+++++++++++++++")while (iterator.hasNext) {println(iterator.next())}// foreacharr2.foreach((ele: Int) => {println(ele)})arr2.foreach(println(_))println(arr2.mkString("----"))// 3. 添加元素,由于是不可变数组,因此添加元素之后,生成一个新的数组// 30------199------2------3------4------65------2val array: Array[Any] = arr2.:+(2).+:(30)// 往后追加元素 :+,往前追加元素 +:2 +: arr2 :+ 10 :+ 10println(array.mkString("------"))arr2 ++ Array(2)}}
  2. 可变数组

    package chapter07import scala.collection.mutable
    import scala.collection.mutable.ArrayBufferobject Test02_mutableArrayBuff {def main(args: Array[String]): Unit = {// 1. 创建一个可变数组,无任何元素val arr = new ArrayBuffer[Int]()println(arr.mkString("--"))arr += 10println(arr.mkString("--"))// 另一种创建方法val arr2: ArrayBuffer[Int] = ArrayBuffer(19, 10, 2)println(arr2)println(arr2.mkString("==="))// 2. 访问元素println(arr2(0))// 3. 添加元素val newArr = arr2 :+ 10println(newArr == arr2)println(arr2)// 不建议这样的操作,建议arr2 += 10val arr3 = arr2 += 10println(arr3 == arr2)101 +=: arr3println(arr3)// 可变集合推荐调用方法arr3.append(10, 1999)arr3.prepend(10092)arr3.insert(2, 22222)println(arr3)// 添加一个数组arr3.insertAll(1, arr)println(arr3)// 4. 删除元素,指定位置arr3.remove(1)println(arr3)arr3.remove(1, 2)println(arr3)// 删除特定值arr3 -= 10println(arr3)// 5. 可变数组与不可变数组之间的转换val arr5 = ArrayBuffer(10, 2, 3, 1)val newArr5: Array[Int] = arr5.toArrayprintln(newArr5.mkString("-"))val buffer: mutable.Buffer[Int] = newArr5.toBufferprintln(buffer)println(newArr5)}}
    
  3. 多维度数组

    package chapter07object Test03_MulArray {def main(args: Array[String]): Unit = {// 创建2维数组val array: Array[Array[Int]] = Array.ofDim[Int](2, 3)// 访问元素array(0)(2) = 10println(array.mkString("-"))for (i <- 0 until array.length; j <- 0 until array(i).length) {println(array(i)(j))}val array1: Array[Array[String]] = Array.ofDim[String](2, 3)for (i <- array1.indices; j <- array1(i).indices) {print(array1(i)(j) + "\t")if (j == array1(i).length - 1) println()}array.foreach((line) => {line.foreach(println(_))})array.foreach(_.foreach(println))}}

7.3 列表List

  1. 不可变列表

    package chapter07object Test04_ImmutableList {def main(args: Array[String]): Unit = {// 列表// 1. 创建List,不能用class创建,只能用伴生对象创建// sealed abstract class List 中sealed表示List类的子类只能在本文件创建val list1 = List(1, 2, 3, 4, 5, 6)println(list1)// 2. 访问和遍历元素println(list1(0))// 此处不能像Array更改某个位置的值// list1(0) = 10 error//list1.foreach(println)// 3. 添加元素// 头部添加 10 +: list1val list2: List[Int] = list1.+:(10)// 尾部添加 list1 :+ 19val list3: List[Int] = list1.:+(19)println(list2)println(list3)// 双冒号主要用于创建一个列表val list4 = list1.::(51)println(list4)println(52 :: list1)// 创建一个列表val list5 = 32 :: 39 :: Nil// 4. 列表合并val list6 = list4 :: list5// List(List(51, 1, 2, 3, 4, 5, 6), 32, 39)println(list6)// 3冒号用于列表拼接,扁平化合并val list7 = list4 ::: list5// List(51, 1, 2, 3, 4, 5, 6, 32, 39)println(list7)// 等价,列表拼接,扁平化合并println(list4 ++ list5)}}
  2. 可变列表

    package chapter07import scala.collection.mutable.ListBufferobject Test05_MutableListBuffer {def main(args: Array[String]): Unit = {// 1. 创建可变列表val list1 = new ListBuffer[Int]()val list2 = ListBuffer(12, 13, 29)println(list1)println(list2)// 2. 添加元素,使用方法函数list1.append(1, 2, 3)list1.insert(1, 19, 22)list2.prepend(34, 2)println(list1)println(list2)// 3. 合并list ++ 会返回新的对象,++= 会更改val list3 = list1 ++ list2println(list3)list1 ++= list2println(list1)// 4. 修改元素list2(2) = 3333list2.update(0, 99)println(list2)// 5. 删除元素// 指定位置删除list2.remove(2)// 指定元素删除list2 -= 29println(list2)}}

7.4 Set 集合

  1. 不可变Set

    package chapter07object Test06_ImmutableSet {def main(args: Array[String]): Unit = {// 1. 创建Set,new Set()不能创建,Set为特征,因此只能用伴生对象创建val set1 = Set(1, 2, 3, 34, 2, 3)println(set1)// 2. 添加元素println("=========2. 添加元素============")val set2 = set1 + 10 + 10 + 20 + 20 + 30println(set2)// 3. 合并setprintln("=========3. 合并set============")val set3 = Set(1, 2, 3, 4, 9, 10)val set4 = set2 ++ set3println(set4)// 4. 删除元素println("=========4. 删除元素============")val set5 = set4 - 30println(set4)println(set5)}}
  2. 可变Set

    package chapter07import scala.collection.mutableobject Test07_MutableSet {def main(args: Array[String]): Unit = {// 1. 创建可变setval set1: mutable.Set[Int] = mutable.Set(1, 2, 3, 4, 10)println(set1)// 2. 添加元素,使用方法名println("============2. 添加元素============")val flag1 = set1.add(12)println(set1)println(flag1)val flag2 = set1.add(12)println(set1)println(flag2)// 3. 删除元素println("============3. 删除元素============")set1.remove(12)println(set1)// 4. 合并两个set ++=println("============4. 合并两个set============")val set3 = mutable.Set(111, 222, 3, 4, 101)println(set1)println(set3)set1 ++= set3println(set1)println(set3)}}

7.5 Map 集合

image

  1. 不可变Map

    package chapter07object Test08_ImmutableMap {def main(args: Array[String]): Unit = {// 1. 创建Mapval map1: Map[String, Int] = Map[String, Int]("scc" -> 18, "hello" -> 10)println(map1)println(map1.getClass)val map0 = Map[String, Int]()println(map0)println(map0.getClass)// 2. 遍历元素map1.foreach(println(_))map1.foreach(kv => println(s"key is ${kv._1}, value is ${kv._2}"))// 3. 取map中所有key或者value/*** println(s"$key-->${map1.get(key)}")* scc-->Some(18)* hello-->Some(10)*/for (key <- map1.keys) {println(s"$key-->${map1.get(key)}")println(s"$key-->${map1.getOrElse(key, 0)}")}for (value <- map1.values) {println(value)}}}
  2. 可变Map

    package chapter07import scala.collection.mutableobject Test09_MutableMap {def main(args: Array[String]): Unit = {// 1. 创建Mapval map1 = mutable.Map[String, Int]("scc" -> 18, "hello" -> 10)println(map1)println(map1.getClass)// 2. 添加元素map1.put("zyy", 19)println(map1)map1 += (("a", 20), ("b", 22))println(map1)// 3. 删除元素map1.remove("zyy")map1 -= "d"println(map1)// 4. 修改元素map1.update("a", 209)println(map1)// 5. 合并两个Mapval map2 = mutable.Map[String, Int]("x" -> 108, "hello" -> 11)println(map1)println(map2)map1 ++= map2println(map1)println(map2)val map3: mutable.Map[String, Int] = map1 ++ map2// 6. immutable.map 和 mutable.map 互转val map4: Map[String, Int] = map3.toMapval map5: mutable.Map[String, Int] = collection.mutable.Map(map4.toSeq: _*)}}

7.6 元组

image

package chapter07object Test10_Tuple {def main(args: Array[String]): Unit = {// 1. 创建元组val tuple1: (String, Int, Char, Boolean) = ("hello", 100, 'a', true)println(tuple1)// 2. 访问数据println(tuple1._1)println(tuple1._2)println(tuple1._3)println(tuple1._4)// 索引从0开始,建议使用下划线_println(tuple1.productElement(1))// 3. 遍历元组数据for (ele <- tuple1.productIterator) {println(ele)}// 4. 嵌套元组val mulTuple = (12, 0.3, "hello", (23, "scala"), 29)println(mulTuple._1)println(mulTuple._4._2)}}

7.7 集合常用函数

image

  1. 通用属性和操作

    package chapter07object Test11_CommonOp {def main(args: Array[String]): Unit = {val list: List[Int] = List(1, 2, 3, 4)val set = Set(1, 2, 3, 4)// 1. 获取集合长度println(list.length)// 3. 获取集合大小println(list.size)println(set.size)// 3. 循环遍历for (elem <- list){println(elem)}// 4. 迭代器for (elem <- list.iterator){println(elem)}val iterator: Iterator[Int] = list.iteratorwhile (iterator.hasNext){println(iterator.next())}// 5. 生成字符串println(list)println(set)println(list.mkString("--"))// 6. 是否包含println(list.contains(1))println(list.contains(5))println(set.contains(2))}}
  2. 衍生集合

    image

    package chapter07object Test12_DerivedCollection {def main(args: Array[String]): Unit = {val list1: List[Int] = List(1, 3, 5, 7, 2, 89)val list2: List[Int] = List(3, 7, 2, 45, 4, 8, 19)// 1. 获取集合的头println("=============1. 获取集合的头=============")println(list1.head)// 2. 获取集合的尾(不是头的尾)println("=============2. 获取集合的尾(不是头的尾)=============")println(list1.tail)// 3. 获取集合的最后一个元素println("=============3. 获取集合的最后一个元素=============")println(list1.last)// 4. 获取集合初始元素(不包含最后一个)println("=============4. 获取集合初始元素(不包含最后一个)=============")println(list1.init)// 5. 翻转println("=============5. 翻转=============")println(list1.reverse)// 6. 取前(后)n个元素println("=============6. 取前(后)n个元素=============")println(list1.take(3))println(list1.takeRight(4))// 7. 去掉前(后)n个元素println("=============7. 去掉前(后)n个元素=============")println(list1.drop(3))println(list1.dropRight(4))println("=============以下操作,涉及两个集合操作=============")// 8. 交集println("=============8. 交集=============")val intersect = list1 intersect list2println(intersect)// 9. 并集println("=============9. 并集=============")val union = list1 union list2println(union)println(list1 ::: list2)// 10. 差集println("=============10. 差集=============")val diff1: List[Int] = list1.diff(list2)val diff2: List[Int] = list2.diff(list1)println(diff1)println(diff2)// 11. 拉链,取最小集合长度为准println("=============11. 拉链,取最小集合长度为准=============")println(s"list1: $list1")println(s"list2: $list2")val zip1: List[(Int, Int)] = list1.zip(list2)val zip2: List[(Int, Int)] = list2.zip(list1)println(s"zip1: $zip1")println(s"zip2: $zip2")// 12. 滑窗println("=============12. 滑窗=============")// List(1, 3, 5, 7, 2, 89)println(list1)/*** List(1)* List(3)* List(5)* List(7)* List(2)* List(89)*/list1.sliding(1).foreach(println)/*** List(1, 3)* List(3, 5)* List(5, 7)* List(7, 2)* List(2, 89)*/list1.sliding(2).foreach(println)/*** List(1, 3)* List(7, 2)*/list1.sliding(2, 3).foreach(println)/*** 窗口无重复数据,又叫滚动滑动窗口* List(1, 3)* List(5, 7)* List(2, 89)*/list1.sliding(2, 2).foreach(println)}}
  3. 简单计算函数

    image

    package chapter07object Test13_SimpleOp {def main(args: Array[String]): Unit = {val list: List[Int] = List(5, 1, 8, 2, -3, 4)val list2 = List(("a", 5), ("b", 1), ("c", 8), ("d", 2), ("e", -3), ("f", 4))// 1. 求和println(list.sum)val i: Int = list.reduce((a, b) => {a + b})println(i)// 2. 求积println(list.product)// 3. 最大值println(list.max)println(list2.max)println(list2.maxBy(elem => {elem._2}))println(list2.maxBy(_._2))// 4. 最小值println(list.min)// 5. 排序// 按照第一个位置元素排序/*** List(-3, 1, 2, 4, 5, 8)* List(8, 5, 4, 2, 1, -3)* List((a,5), (b,1), (c,8), (d,2), (e,-3), (f,4))* List((f,4), (e,-3), (d,2), (c,8), (b,1), (a,5))*/println(list.sorted) // 从小到大排序println(list.sorted(scala.math.Ordering.Int.reverse)) // 从大到小排序println(list2.sorted) // 从小到大排序println(list2.sorted(scala.math.Ordering.Tuple2[String, Int].reverse)) // 从大到小排序// 指定位置元素排序,从大到小/*** List((c,8), (a,5), (f,4), (d,2), (b,1), (e,-3))* List((c,8), (a,5), (f,4), (d,2), (b,1), (e,-3))*/println(list2.sortBy(elem => {elem._2})(scala.math.Ordering[Int].reverse))println(list2.sortBy(_._2)(scala.math.Ordering.Int.reverse))// 上面方法太麻烦,使用sortWith进行简化println(list.sortWith(_ < _))println(list.sortWith(_ > _))list2.sortWith((a, b) => {a._2 > b._2})/*** sorted:适合单集合的升降序** sortBy:适合对单个或多个属性的排序,代码量比较少,推荐使用这种** sortWith:适合定制化场景比较高的排序规则,比较灵活,也能支持单个或多个属性的排序,但代码量稍多,内部实际是通过java里面的Comparator接口来完成排序的。**/}}
  4. 高级计算函数

    image​​

    image

    package chapter07object Test14_HighLevelFunction_Map {def main(args: Array[String]): Unit = {/*** List(2, 4, 6, 8)* List(2, 4, 6, 8, 10, 12, 14, 16, 18)* List(List(1, 2, 3), List(4, 5), List(6, 7, 8, 9))* List(1, 2, 3, 4, 5, 6, 7, 8, 9)* List(Hello, Scala, Hello, World)* List(Hello, Scala, Hello, World)* Map(1 -> List(1, 3, 5, 7, 9), 0 -> List(2, 4, 6, 8))* Map(2 -> List(2, 5, 8), 1 -> List(1, 4, 7), 0 -> List(3, 6, 9))* Map(S -> List(Scala), W -> List(World), H -> List(Hello, Hello))**/val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9)// 1. 过滤val evenList: List[Int] = list.filter(_ % 2 == 0)println(evenList)// 2. 转化/映射 mapval multiply2: List[Int] = list.map(_ * 2)println(multiply2)// 3. 扁平化val nestedList: List[List[Int]] = List(List(1, 2, 3), List(4, 5), List(6, 7, 8, 9))println(nestedList)val flattenList: List[Int] = nestedList.flattenprintln(flattenList)// 4. 扁平化和映射 flatMap,先map,再flatten// 将一组单词,进行分词,再保存成单词列表val strings: List[String] = List("Hello Scala", "Hello World")println(strings.map(_.split(" ")).flatten)println(strings.flatMap(_.split(" ")))// 5. 分组,groupBy// 直接分成奇数和偶数两组println(list.groupBy(_ % 2))println(list.groupBy(_ % 3))// 给定一组单词,按照单词的首字母进行分组val stringList1: List[String] = List("Hello Scala", "Hello World")println(stringList1.flatMap(_.split(" ")).groupBy((elem) => {elem.charAt(0)}))}}
    
    package chapter07object Test15_HighLevelFunction_Reduce {def main(args: Array[String]): Unit = {val list = List(1, 2, 3, 4)// 1. reduceprintln(list.reduce(_ + _))println(list.reduceLeft(_ + _))println(list.reduceRight(_ + _))println("===============================")/*** -24* -24* 6*/val list2 = List(3, 4, 5, 8, 10)println(list2.reduce(_ - _))println(list2.reduceLeft(_ - _))println(list2.reduceRight(_ - _)) // (3-(4-(5-(8-10))))println("==============2. fold=================")// 2. fold/*** ==============2. fold=================* 20* 20* -5*/println(list.fold(10)(_ + _))println(list.foldLeft(10)(_ + _))println(list2.foldRight(11)(_ - _)) // (3-(4-(5-(8-(10-10)))))}}
  5. 应用案例-合并Map

    package chapter07import scala.collection.mutableobject Test16_MergeMap {def main(args: Array[String]): Unit = {// 遍历map1val map1 = Map("a" -> 1, "b" -> 3, "c" -> 6)// 更新map2val map2 = mutable.Map("a" -> 6, "b" -> 2, "c" -> 9, "d" -> 3)println(map1)println(map2)map1.foreach(elem => {val value1 = elem._2val value2 = map2.getOrElse(elem._1, 0)map2.update(elem._1, value1 + value2)})println(map2)map1.foldLeft(map2)((mergedMap, kv) => {val key = kv._1val value = kv._2mergedMap.update(key, mergedMap.getOrElse(key, 0) + value)mergedMap})println(map2)}}
  6. 队列

    image

  7. 并行集合

    image

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)

目录 一、双向链表二、node(int index) 根据索引找节点三、clear()四、add(int, E&#xff09;五、remove(int index)六、双向链表和单链表七、双向链表和动态数组八、jdk 官方的 LinkedList 的 clear() 方法 一、双向链表 &#x1f381; 单链表的节点中只有一个 next 指针引用…

STM32面试知识点总结分析

一、STM32F1和F4的区别&#xff1f; 内核不同&#xff1a;F1是Cortex-M3内核&#xff0c;F4是Cortex-M4内核&#xff1b; 主频不同&#xff1a;F1主频72MHz&#xff0c;F4主频168MHz&#xff1b; 浮点运算&#xff1a;F1无浮点运算单位&#xff0c;F4有&#xff1b; 功能性…

高压线路零序电流方向保护程序逻辑原理(四)

2&#xff0e;全相循环程序逻辑框图 全相循环程序逻辑简图如图3&#xff0d;18所示。程序入口首先检测标志位UQDB1&#xff0c;在采样中断服务程序中采用3U。突变量来区分接地故障和TA断线&#xff0c;接地故障时Δ3U。大于定值&#xff0c;置标志位UQDB1&#xff0c;这是11型…

Elasticsearch 安装

下载安装 elasticsearch下载链接 运行&#xff1a;bin\elasticsearch.bat 设置密码&#xff1a;.\bin\elasticsearch-setup-passwords interactive 这边设置密码遇到一个坑 PS G:\elasticsearch-8.8.1> .\bin\elasticsearch-setup-passwords interactiveFailed to authe…

AI实战营第二期 第七节 《语义分割与MMSegmentation》——笔记8

文章目录 摘要主要特性 案例什么是语义分割应用&#xff1a;无人驾驶汽车应用&#xff1a;人像分割应用&#xff1a;智能遥感应用 : 医疗影像分析 三种分割的区别语义分割的基本思路按颜色分割逐像素份分类全卷积网络 Fully Convolutional Network 2015存在问题 基于多层级特征…

Python 基于招聘数据可视化系统

1 简介 Python 基于招聘数据可视化系统&#xff0c;视频效果如下&#xff1a; 基于Python的招聘信息可视化系统&#xff0c;附源码 随着国内的经济不断的快速发展&#xff0c;现在学生的就业压力也在逐年增加&#xff0c;网络上的招聘信息非常的丰富&#xff0c;但是对于学生而…

高等数学下拾遗+与matlab结合

如何学好高等数学 高等数学是数学的一门重要分支&#xff0c;包括微积分、线性代数、常微分方程等内容&#xff0c;它是许多理工科专业的基础课程。以下是一些学好高等数学的建议&#xff1a; 扎实的基础知识&#xff1a;高等数学的内容很多&#xff0c;包括初等数学的一些基…

回归预测 | MATLAB实现PSO-CNN粒子群算法优化卷积神经网络的数据多输入单输出回归预测

回归预测 | MATLAB实现PSO-CNN粒子群算法优化卷积神经网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现PSO-CNN粒子群算法优化卷积神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 回归预测 | MATLAB实现PSO-CNN粒子群算法优…

通过Jenkins实现Unity多平台自动打包以及相关问题解决

简介 通过本文可以了解到如何在windows和mac上部署Jenkins。并且通过Jenkins实现Unity在IOS,安卓和PC等多平台自动打包的功能&#xff0c;并且可以将打包结果通过飞书机器人同步到飞书群内。优化工作流&#xff0c;提高团队的开发效率。文末记录了实际使用Jenkins时遇到的各种问…

探索数字化前沿:数字化产品引领科技创新风潮

随着数字化时代的到来&#xff0c;国内数字化产品市场蓬勃发展&#xff0c;涌现出许多引领行业变革的产品。本文将介绍几个在数字孪生和人工智能领域取得突破的国内产品&#xff0c;带大家了解数字化产品的创新应用和影响力。 山海鲸可视化&#xff1a;山海鲸可视化是一款强大…

如何使用 Terraform 和 Git 分支有效管理多环境?

作者&#xff5c;Sumeet Ninawe 翻译&#xff5c;Seal软件 链接&#xff5c;https://spacelift.io/blog/terraform-environments 通常我们使用 Terraform 将我们的基础设施定义为代码&#xff0c;然后用 Terraform CLI 在我们选择的云平台中创建制定的基础设施组件。从表面上看…

Redis 6.2.4集群搭建

1. 说明 这里使用的是redis的cluster集权模式&#xff0c;没有用哨兵模式&#xff08;哨兵模式依赖哨兵节点&#xff0c;哨兵节点一旦挂掉就不再高可用了&#xff0c;因此没有采用&#xff09;。 由于Redis Cluster至少需要6个节点&#xff0c;因此&#xff0c;这里咱们采用的…