Scala中的集合、不可变List、可变ListBuffer、不可变Set、可变HashSet、不可变Map、可变HashMap 08

朴灿烈づ我的快乐病毒、 2022-02-04 12:47 648阅读 0赞

前言

Scala的集合有三类:序列Seq、Set、映射Map,所有的集合都扩展自Iterable特质,在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable类型的集合初始化后内容就不能改变了。

1. List

1.1 不可变的序列 import scala.collection.immutable._

在Scala中,列表要么为空(Nil表示空列表),要么是一个head元素加上一个tail列表。
List常用操作

  • +: (elem: A): List[A] 在列表的头部添加一个元素
  • :: (x: A): List[A] 在列表的头部添加一个元素
  • :+ (elem: A): List[A] 在列表的尾部添加一个元素
  • ++[B](that: GenTraversableOnce[B]): List[B] 从列表的尾部添加另外一个列表
  • ::: (prefix: List[A]): List[A] 在列表的头部添加另外一个列表
    val left = List(1,2,3)
    val right = List(4,5,6)
  • 以下操作等价
    left ++ right // List(1,2,3,4,5,6)
    right.:::(left) // List(1,2,3,4,5,6)
  • 以下操作等价
    0 +: left //List(0,1,2,3)
    left.+:(0) //List(0,1,2,3)
  • 以下操作等价
    left :+ 4 //List(1,2,3,4)
    left.:+(4) //List(1,2,3,4)
  • 以下操作等价
    0 :: left //List(0,1,2,3)
    left.::(0) //List(0,1,2,3)

    /* 不可变List集合操作 */
    object ImmutListDemo {
    def main(args: Array[String]) {

    1. //创建一个不可变的集合
    2. val lst1 = List(1,2,3)
    3. //补充:另一种定义list方法
    4. val other_lst=2::Nil
    5. //获取集合的第一个元素
    6. val first=lst1.head
    7. //获取集合中除第一个元素外的其他元素集合,
    8. val tail=lst1.tail
    9. //补充:其中如果 List 中只有一个元素,那么它的 head 就是这个元素,它的 tail 就是 Nil;
    10. println(other_lst.head+"----"+other_lst.tail)
    11. //将0插入到lst1的前面生成一个新的List
    12. val lst2 = 0 :: lst1
    13. val lst3 = lst1.::(0)
    14. val lst4 = 0 +: lst1
    15. val lst5 = lst1.+:(0)

    //将一个元素添加到lst1的后面产生一个新的集合

    1. val lst6 = lst1 :+ 3
    2. val lst0 = List(4,5,6)
    3. //将2个list合并成一个新的List
    4. val lst7 = lst1 ++ lst0
    5. //将lst0插入到lst1前面生成一个新的集合
    6. val lst8 = lst1 ++: lst0
    7. //将lst0插入到lst1前面生成一个新的集合
    8. val lst9 = lst1.:::(lst0)
    9. println(other_lst)
    10. println(lst1)
    11. println(first)
    12. println(tail)
    13. println(lst2)
    14. println(lst3)
    15. println(lst4)
    16. println(lst5)
    17. println(lst6)
    18. println(lst7)
    19. println(lst8)
    20. println(lst9)

    }
    }

1.2 可变的序列 import scala.collection.mutable._

  1. import scala.collection.mutable.ListBuffer
  2. object MutListDemo extends App{
  3. //构建一个可变列表,初始有3个元素1,2,3
  4. val lst0 = ListBuffer[Int](1,2,3)
  5. //创建一个空的可变列表
  6. val lst1 = new ListBuffer[Int]
  7. //向lst1中追加元素,注意:没有生成新的集合
  8. lst1 += 4
  9. lst1.append(5)
  10. //将lst1中的元素最近到lst0中, 注意:没有生成新的集合
  11. lst0 ++= lst1
  12. //将lst0和lst1合并成一个新的ListBuffer 注意:生成了一个集合
  13. val lst2= lst0 ++ lst1
  14. //将元素追加到lst0的后面生成一个新的集合
  15. val lst3 = lst0 :+ 5
  16. //删除元素,注意:没有生成新的集合
  17. val lst4 = ListBuffer[Int](1,2,3,4,5)
  18. lst4 -= 5
  19. //删除一个集合列表,生成了一个新的集合
  20. val lst5=lst4--List(1,2)
  21. //把可变list 转换成不可变的list 直接加上toList
  22. val lst6=lst5.toList
  23. //把可变list 转变数组用toArray
  24. val lst7=lst5.toArray
  25. println(lst0)
  26. println(lst1)
  27. println(lst2)
  28. println(lst3)
  29. println(lst4)
  30. println(lst5)
  31. println(lst6)
  32. println(lst7)
  33. }

2. Set

2.1 不可变的Set import scala.collection.immutable._

Set代表一个没有重复元素的集合;将重复元素加入Set是没有用的,而且 Set 是不保证插入顺序的,即 Set 中的元素是乱序的。
定义:val set=Set(元素,元素,…)

  1. //定义一个不可变的Set集合
  2. scala> val set =Set(1,2,3,4,5,6,7)
  3. set: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 7, 3, 4)
  4. //元素个数
  5. scala> set.size
  6. res0: Int = 7
  7. //取集合最小值
  8. scala> set.min
  9. res1: Int = 1
  10. //取集合最大值
  11. scala> set.max
  12. res2: Int = 7
  13. //将元素和set1合并生成一个新的set,原有set不变
  14. scala> set + 8
  15. res3: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 7, 3, 8, 4)
  16. scala> val set1=Set(7,8,9)
  17. set1: scala.collection.immutable.Set[Int] = Set(7, 8, 9)
  18. //两个集合的交集
  19. scala> set & set1
  20. res4: scala.collection.immutable.Set[Int] = Set(7)
  21. //两个集合的并集
  22. scala> set ++ set1
  23. res5: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 9, 2, 7, 3, 8, 4)
  24. //在第一个set基础上去掉第二个set中存在的元素
  25. scala> set -- set1
  26. res6: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)
  27. //返回第一个不同于第二个set的元素集合
  28. scala> set &~ set1
  29. res7: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)
  30. //计算符合条件的元素个数
  31. scala> set.count(_ >5)
  32. res8: Int = 2
  33. /返回第一个不同于第二个的元素集合
  34. scala> set.diff(set1)
  35. res9: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)
  36. /返回第一个不同于第二个的元素集合
  37. scala> set1.diff(set)
  38. res10: scala.collection.immutable.Set[Int] = Set(8, 9)
  39. //取子set(2,5为元素位置, 从0开始,包含头不包含尾)
  40. scala> set.slice(2,5)
  41. res11: scala.collection.immutable.Set[Int] = Set(6, 2, 7)
  42. //迭代所有的子set,取指定的个数组合
  43. scala> set1.subsets(2).foreach(x=>println(x))
  44. Set(7, 8)
  45. Set(7, 9)
  46. Set(8, 9)

2.2 可变的Set import scala.collection.mutable._

  1. //导入包
  2. scala> import scala.collection.mutable
  3. import scala.collection.mutable
  4. //定义一个可变的Set
  5. scala> val set1=new HashSet[Int]()
  6. set1: scala.collection.mutable.HashSet[Int] = Set()
  7. //添加元素
  8. scala> set1 += 1
  9. res1: set1.type = Set(1)
  10. //添加元素 add等价于+=
  11. scala> set1.add(2)
  12. res2: Boolean = true
  13. scala> set1
  14. res3: scala.collection.mutable.HashSet[Int] = Set(1, 2)
  15. //向集合中添加元素集合
  16. scala> set1 ++=Set(1,4,5)
  17. res5: set1.type = Set(1, 5, 2, 4)
  18. //删除一个元素
  19. scala> set1 -=5
  20. res6: set1.type = Set(1, 2, 4)
  21. //删除一个元素
  22. scala> set1.remove(1)
  23. res7: Boolean = true
  24. scala> set1
  25. res8: scala.collection.mutable.HashSet[Int] = Set(2, 4)

3. Map

3.1 不可变的Map import scala.collection.immutable._

  1. 定义Map集合
  2. 1.val map=Map(键 -> , -> 值...)
  3. 2.利用元组构建 val map=Map((键,值), (键,值) , (键,值)....)
  4. 展现形式:
  5. val map = Map(“zhangsan”->30,”lisi”->40)
  6. val map = Map((“zhangsan”,30),(“lisi”,40))
  7. 3.操作map集合
  8. 获取值: 值=map(键)
  9. 原则:通过先获取键,在获取键对应值。
  10. 4.遍历map集合
  11. scala> val imap=Map("zhangsan" -> 20,"lisi" ->30)
  12. imap: scala.collection.immutable.Map[String,Int] = Map(zhangsan -> 20, lisi -> 30)
  13. //方法一:显示所有的key
  14. scala> imap.keys
  15. res0: Iterable[String] = Set(zhangsan, lisi)
  16. //方法二:显示所有的key
  17. scala> imap.keySet
  18. res1: scala.collection.immutable.Set[String] = Set(zhangsan, lisi)
  19. //通过key获取value
  20. scala> imap("lisi")
  21. res2: Int = 30
  22. //通过key获取value 有key对应的值则返回,没有就返回默认值0,
  23. scala> imap.getOrElse("zhangsan",0)
  24. res4: Int = 20
  25. //没有对应的key,返回默认0
  26. scala> imap.getOrElse("zhangsan1",0)
  27. res5: Int = 0
  28. //由于是不可变map,故不能向其添加、删除、修改键值对

3.2 可变的Map import scala.collection.mutable._

  1. //导包
  2. import scala.collection.mutable
  3. //声明一个可变集合
  4. scala> val user =mutable.HashMap("zhangsan"->50,"lisi" -> 100)
  5. user: scala.collection.mutable.HashMap[String,Int] = Map(lisi -> 100, zhangsan -> 50)
  6. //添加键值对
  7. scala> user +=("wangwu" -> 30)
  8. res0: user.type = Map(lisi -> 100, zhangsan -> 50, wangwu -> 30)
  9. //添加多个键值对
  10. scala> user += ("zhangsan0" -> 30,"lisi0" -> 20)
  11. res1: user.type = Map(zhangsan0 -> 30, lisi -> 100, zhangsan -> 50, lisi0 -> 20,wangwu -> 30)
  12. //方法一:显示所有的key
  13. scala> user.keys
  14. res2: Iterable[String] = Set(zhangsan0, lisi, zhangsan, lisi0, wangwu)
  15. //方法二:显示所有的key
  16. scala> user.keySet
  17. res3: scala.collection.Set[String] = Set(zhangsan0, lisi, zhangsan, lisi0, wangwu)
  18. //通过key获取value
  19. scala> user("zhangsan")
  20. res4: Int = 50
  21. //通过key获取value 有key对应的值则返回,没有就返回默认值0,
  22. scala> user.getOrElse("zhangsan",0)
  23. res5: Int = 50
  24. //没有对应的key,返回默认0
  25. scala> user.getOrElse("zhangsan1",0)
  26. res6: Int = 0
  27. //更新键值对
  28. scala> user("zhangsan") = 55
  29. scala> user("zhangsan")
  30. res8: Int = 55
  31. //更新多个键值对
  32. scala> user += ("zhangsan" -> 60, "lisi" -> 50)
  33. res9: user.type = Map(zhangsan0 -> 30, lisi -> 50, zhangsan -> 60, lisi0 -> 20,wangwu -> 30)
  34. //删除key
  35. scala> user -=("zhangsan")
  36. res14: user.type = Map(zhangsan0 -> 30, lisi -> 50, lisi0 -> 20, wangwu -> 30)
  37. //删除key
  38. scala>user.remove("zhangsan0")
  39. //遍历map 方法一:通过key值
  40. scala> for(x<- user.keys) println(x+" -> "+user(x))
  41. lisi -> 50
  42. lisi0 -> 20
  43. wangwu -> 30
  44. //遍历map 方法二:模式匹配
  45. scala> for((x,y) <- user) println(x+" -> "+y)
  46. lisi -> 50
  47. lisi0 -> 20
  48. wangwu -> 30
  49. //遍历map 方法三:通过foreach
  50. scala> user.foreach{ case (x,y) => println(x+" -> "+y)}
  51. lisi -> 50
  52. lisi0 -> 20
  53. wangwu -> 30

发表评论

表情:
评论列表 (有 0 条评论,648人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java可变集合

    前言必读 > [读者手册(必读)\_云边的快乐猫的博客-CSDN博客][-CSDN] 一、概念 1.什么是不可变集合? 答:整个生命周期都不能被修改的集合,增删改都

    相关 python 可变可变变量

    不可变变量 操作某个对象时,重新开辟了内存,使其内存地址改变了,我们称其为可变对象,反之称为不可变变量 我们可以通过下面的例子来感受上面的话 x=1

    相关 可变对象与可变对象

    前阵子我们聊了下函数的参数传递以及变量赋值的一些内容:[关于函数参数传递,80%人都错了][80] 简单回顾下要点: 1. Python 中的变量不是装有对象的“容器”,而