第五课 尚硅谷Scala语言学习-常用集合类型学习

本文详细介绍了Scala中的集合类型,包括不可变与可变数组、列表、Set和Map的使用,以及元组的概念。通过示例展示了如何创建、访问、修改这些集合,并探讨了不可变与可变集合的区别。此外,还涵盖了多维数组的操作和元组的访问方法。
摘要由CSDN通过智能技术生成

第五课 尚硅谷Scala语言学习-常用集合类型学习

第一节 集合类型简介

  1. Scala 的集合有三大类:序列 Seq、集 Set、映射 Map,所有的集合都扩展自 Iterable特质。
  2. 对于几乎所有的集合类,Scala 都同时提供了可变和不可变的版本,分别位于以下两个包
    • 不可变集合:scala.collection.immutable
    • 可变集合: scala.collection.mutable
  3. Scala 不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而不会对原对象进行修改。类似于 java 中的 String 对象
  4. Scala 可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类于 java 中 StringBuilder 对象。
  5. 建议:在操作集合的时候,不可变用符号,可变用方法
  6. 不可变集合继承图
    • Set、Map 是 Java 中也有的集合
    • Seq 是 Java 没有的,我们发现 List 归属到 Seq 了,因此这里的 List 就和 Java 不是同一个概念了
    • 我们前面的 for 循环有一个 1 to 3,就是 IndexedSeq 下的 Range
    • String 也是属于 IndexedSeq, 虚线表示隐式转换
    • 我们发现经典的数据结构比如 Queue 和 Stack 被归属到 LinearSeq(线性序列)
    • 大家注意 Scala 中的 Map 体系有一个 SortedMap,说明 Scala 的 Map 可以支持排序
    • IndexedSeq 和 LinearSeq 的区别:
      • IndexedSeq 是通过索引来查找和定位,因此速度快,比如 String 就是一个索引集合,通过索引即可定位
      • LinearSeq 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找
        在这里插入图片描述
  7. 可变集合继承图
    在这里插入图片描述

第二节 数组

2.1 不可变数组

  1. 第一种方式定义数组
    • new 是关键字
    • [Int]是指定可以存放的数据类型,如果希望存放任意数据类型,则指定 Any
    • (10),表示数组的大小,确定后就不可以变化
  2. 第二种方式定义数组
    • 在定义数组时,直接赋初始值
    • 使用 apply 方法创建数组对象
// 定义
val arr1 = new Array[Int](10) // 第一种方式
val arr1 = Array(1, 2) // 第二种方式
  1. 案例实操
package chapter07

object Test01_ImmutableArray {
  def main(args: Array[String]): Unit = {
    // 1. 创建数组
    val arr: Array[Int] = new Array[Int](5)
    // 另一种创建方式
    val arr2 = Array(12, 37, 42, 58, 97)
    println(arr)

    // 2. 访问元素
    println(arr(0))
    println(arr(1))
    println(arr(4))
//    println(arr(5))

    arr(0) = 12
    arr(4) = 57
    println(arr(0))
    println(arr(1))
    println(arr(4))

    println("========================")

    // 3. 数组的遍历
    // 1) 普通for循环
    for (i <- 0 until arr.length){
      println(arr(i))
    }

    for (i <- arr.indices) println(arr(i))

    println("---------------------")

    // 2) 直接遍历所有元素,增强for循环
    for (elem <- arr2) println(elem)

    println("---------------------")

    // 3) 迭代器
    val iter = arr2.iterator

    while (iter.hasNext)
      println(iter.next())

    println("---------------------")

    // 4) 调用foreach方法
    arr2.foreach( (elem: Int) => println(elem) )

    arr.foreach( println )

    println(arr2.mkString("--"))

    println("========================")
    // 4. 添加元素
    val newArr = arr2.:+(73)
    println(arr2.mkString("--"))
    println(newArr.mkString("--"))

    val newArr2 = newArr.+:(30)
    println(newArr2.mkString("--"))

    val newArr3 = newArr2 :+ 15
    val newArr4 = 19 +: 29 +: newArr3 :+ 26 :+ 73
    println(newArr4.mkString(", "))
  }
}

2.2 可变数组

  1. 定义变长数组
    • [Any]存放任意数据类型
    • (3, 2, 5)初始化好的三个元素
    • ArrayBuffer 需要引入 scala.collection.mutable.ArrayBuffer
val arr01 = ArrayBuffer[Any](3, 2, 5)
  1. 案例实操
    • ArrayBuffer 是有序的集合
    • 增加元素使用的是 append 方法(),支持可变参数
  2. 不可变数组与可变数组的转换
    • arr1.toBuffer //不可变数组转可变数组
    • arr2.toArray //可变数组转不可变数组
    • arr2.toArray 返回结果才是一个不可变数组,arr2 本身没有变化
    • arr1.toBuffer 返回结果才是一个可变数组,arr1 本身没有变化
package chapter07

import scala.collection.mutable
import scala.collection.mutable.ArrayBuffer

object Test02_ArrayBuffer {
  def main(args: Array[String]): Unit = {
    // 1. 创建可变数组
    val arr1: ArrayBuffer[Int] = new ArrayBuffer[Int]()
    val arr2 = ArrayBuffer(23, 57, 92)

    println(arr1)
    println(arr2)

    // 2. 访问元素
//    println(arr1(0))     // error
    println(arr2(1))
    arr2(1) = 39
    println(arr2(1))

    println("======================")
    // 3. 添加元素
    val newArr1 = arr1 :+ 15
    println(arr1)
    println(newArr1)
    println(arr1 == newArr1)

    val newArr2 = arr1 += 19
    println(arr1)
    println(newArr2)
    println(arr1 == newArr2)
    newArr2 += 13
    println(arr1)

    77 +=: arr1
    println(arr1)
    println(newArr2)

    arr1.append(36)
    arr1.prepend(11, 76)
    arr1.insert(1, 13, 59)
    println(arr1)

    arr1.insertAll(2, newArr1)
    arr1.prependAll(newArr2)

    println(arr1)

    // 4. 删除元素
    arr1.remove(3)
    println(arr1)

    arr1.remove(0, 10)
    println(arr1)

    arr1 -= 13
    println(arr1)

    // 5. 可变数组转换为不可变数组
    val arr: ArrayBuffer[Int] = ArrayBuffer(23, 56, 98)
    val newArr: Array[Int] = arr.toArray
    println(newArr.mkString(", "))
    println(arr)

    // 6. 不可变数组转换为可变数组
    val buffer: mutable.Buffer[Int] = newArr.toBuffer
    println(buffer)
    println(newArr)
  }
}

2.3 多维数组

  1. 多维数组定义
// 说明:二维数组中有三个一维数组,每个一维数组中有四个元素
val arr = Array.ofDim[Double](3,4)
  1. 案例实操
package chapter07

object Test03_MulArray {
  def main(args: Array[String]): Unit = {
    // 1. 创建二维数组
    val array: Array[Array[Int]] = Array.ofDim[Int](2, 3)

    // 2. 访问元素
    array(0)(2) = 19
    array(1)(0) = 25

    println(array.mkString(", "))
    for (i <- 0 until array.length; j <- 0 until array(i).length){
      println(array(i)(j))
    }
    for (i <- array.indices; j <- array(i).indices){
      print(array(i)(j) + "\t")
      if (j == array(i).length - 1) println()
    }

    array.foreach(line => line.foreach(println))

    array.foreach(_.foreach(println))
  }
}

第三节 列表List

3.1 不可变 List

  1. List 默认为不可变集合
  2. 创建一个 List(数据有顺序,可重复)
  3. 遍历 List
  4. List 增加数据
  5. 集合间合并:将一个整体拆成一个一个的个体,称为扁平化
  6. 取指定数据
  7. 空集合 Nil
package chapter07

object Test04_List {
  def main(args: Array[String]): Unit = {
    // 1. 创建一个List
    val list1 = List(23, 65, 87)
    println(list1)

    // 2. 访问和遍历元素
    println(list1(1))
//    list1(1) = 12 // 这里不能直接赋值 没有update的方法
    list1.foreach(println)

    // 3. 添加元素
    val list2 = 10 +: list1
    val list3 = list1 :+ 23
    println(list1)
    println(list2)
    println(list3)

    println("==================")
    // 把51 添加到列表前面
    val list4 = list2.::(51)
    println(list4)
	
	// 一边用.::创建一个列表 而不是添加元素在列表前面
    val list5 = Nil.::(13)
    println(list5)

    val list6 = 73 :: 32 :: Nil
    val list7 = 17 :: 28 :: 59 :: 16 :: Nil
    println(list7)

    // 4. 合并列表 
    // list6作为一个整体和list7合并
    val list8 = list6 :: list7
    println(list8)

    // list6每个元素拿出来和list7合并
    val list9 = list6 ::: list7
    println(list9)
      
    // list6每个元素拿出来和list7合并
    val list10 = list6 ++ list7
    println(list10)

  }
}

3.2 可变 ListBuffer

  1. 创建一个可变集合 ListBuffer
  2. 向集合中添加数据
  3. 打印集合数据
package chapter07

import scala.collection.mutable.ListBuffer

object Test05_ListBuffer {
  def main(args: Array[String]): Unit = {
    // 1. 创建可变列表
    val list1: ListBuffer[Int] = new ListBuffer[Int]()
    val list2 = ListBuffer(12, 53, 75)

    println(list1)
    println(list2)

    println("==============")

    // 2. 添加元素
    list1.append(15, 62)
    list2.prepend(20)

    list1.insert(1, 19, 22)

    println(list1)
    println(list2)

    println("==============")

    31 +=: 96 +=: list1 += 25 += 11
    println(list1)

    println("==============")
    // 3. 合并list
    val list3 = list1 ++ list2
    println(list1)
    println(list2)

    println("==============")

    list1 ++=: list2
    println(list1)
    println(list2)

    println("==============")

    // 4. 修改元素
    list2(3) = 30
    list2.update(0, 89)
    println(list2)

    // 5. 删除元素
    list2.remove(2)
    list2 -= 25
    println(list2)
  }
}

第四节 Set 集合

4.1 不可变 Set

  1. 默认情况下 ,Scala使用的是不可变集合 ,如果你想使用可变集合,需要引用scala.collection.mutable.Set
  2. Set 默认是不可变集合,数据无序
  3. 数据不可重复
  4. 遍历集合
package chapter07

object Test06_ImmutableSet {
  def main(args: Array[String]): Unit = {
    // 1. 创建set
    val set1 = Set(13, 23, 53, 12, 13, 23, 78)
    println(set1)

    println("==================")

    // 2. 添加元素
    val set2 = set1 + 129
    println(set1)
    println(set2)
    println("==================")

    // 3. 合并set
    val set3 = Set(19, 13, 23, 53, 67, 99)
    val set4 = set2 ++ set3
    println(set2)
    println(set3)
    println(set4)

    // 4. 删除元素
    val set5 = set3 - 13
    println(set3)
    println(set5)
  }
}

4.2 可变 mutable.Set

  1. 创建可变集合 mutable.Set
  2. 打印集合
  3. 集合添加元素
  4. 向集合中添加元素,返回一个新的 Set
  5. 删除数据
package chapter07

import scala.collection.mutable

object Test07_MutableSet {
  def main(args: Array[String]): Unit = {
    // 1. 创建set
    val set1: mutable.Set[Int] = mutable.Set(13, 23, 53, 12, 13, 23, 78)
    println(set1)

    println("==================")

    // 2. 添加元素
    val set2 = set1 + 11
    println(set1)
    println(set2)

    set1 += 11
    println(set1)

    val flag1 = set1.add(10)
    println(flag1)
    println(set1)
    val flag2 = set1.add(10)
    println(flag2)
    println(set1)

    println("==================")

    // 3. 删除元素
    set1 -= 11
    println(set1)

    val flag3 = set1.remove(10)
    println(flag3)
    println(set1)
    val flag4 = set1.remove(10)
    println(flag4)
    println(set1)

    println("==================")

    // 4. 合并两个Set
    // val set3 =
  }
}

第五节 Map 集合

5.1 不可变 Map

  1. Scala 中的 Map 和 Java 类似,也是一个散列表,它存储的内容也是键值对(key-value)映射
  2. 创建不可变集合 Map
  3. 循环打印
  4. 访问数据
  5. 如果 key 不存在,返回 0
package chapter07

object Test08_ImmutableMap {
  def main(args: Array[String]): Unit = {
    // 1. 创建map
    val map1: Map[String, Int] = Map("a" -> 13, "b" -> 25, "hello" -> 3)
    println(map1)
    println(map1.getClass)

    println("==========================")
    // 2. 遍历元素
    map1.foreach(println)
    map1.foreach( (kv: (String, Int)) => println(kv) )

    println("============================")

    // 3. 取map中所有的key 或者 value
    for (key <- map1.keys){
      println(s"$key ---> ${map1.get(key)}")
    }

    // 4. 访问某一个key的value
    println("a: " + map1.get("a").get)
    println("c: " + map1.get("c"))
    println("c: " + map1.getOrElse("c", 0))

    println(map1("a"))
  }
}

5.2 可变 Map

  1. 创建可变集合
  2. 打印集合
  3. 向集合增加数据
  4. 删除数据
  5. 修改数据
package chapter07

import scala.collection.mutable

object Test09_MutableMap {
  def main(args: Array[String]): Unit = {
    // 1. 创建map
    val map1: mutable.Map[String, Int] = mutable.Map("a" -> 13, "b" -> 25, "hello" -> 3)
    println(map1)
    println(map1.getClass)

    println("==========================")

    // 2. 添加元素
    map1.put("c", 5)
    map1.put("d", 9)
    println(map1)

    map1 += (("e", 7))
    println(map1)

    println("====================")

    // 3. 删除元素
    println(map1("c"))
    map1.remove("c")
    println(map1.getOrElse("c", 0))

    map1 -= "d"
    println(map1)

    println("====================")

    // 4. 修改元素
    map1.update("c", 5)
    map1.update("e", 10)
    println(map1)

    println("====================")

    // 5. 合并两个Map
    val map2: Map[String, Int] = Map("aaa" -> 11, "b" -> 29, "hello" -> 5)
//    map1 ++= map2
    println(map1)
    println(map2)

    println("---------------------------")
    val map3: Map[String, Int] = map2 ++ map1
    println(map1)
    println(map2)
    println(map3)
  }
}

第六节 元组

  1. 元组也是可以理解为一个容器,可以存放各种相同或不同类型的数据。说的简单点,就是将多个无关的数据封装为一个整体,称为元组。
  2. 注意:元组中最大只能有 22 个元素
  3. 案例实操
    • 声明元组的方式:(元素 1,元素 2,元素 3)
    • 访问元组
    • Map 中的键值对其实就是元组,只不过元组的元素个数为 2,称之为对偶
package chapter07

object Test10_Tuple {
  def main(args: Array[String]): Unit = {
    // 1. 创建元组
    val tuple: (String, Int, Char, Boolean) = ("hello", 100, 'a', true)
    println(tuple)

    // 2. 访问数据
    println(tuple._1)
    println(tuple._2)
    println(tuple._3)
    println(tuple._4)

    println(tuple.productElement(1))

    println("====================")
    // 3. 遍历元组数据
    for (elem <- tuple.productIterator)
      println(elem)

    // 4. 嵌套元组
    val mulTuple = (12, 0.3, "hello", (23, "scala"), 29)
    println(mulTuple._4._2)
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值