一 集合简介

  • 三大类:序列Seq、集Set、映射Map
  • 分为可变(scala.collection.immutable)和不可变(scala.collection.mutable)

    • 可变类似于StringBuilder
    • 不可变类似于String(任何修改都会返回一个新集合

    [ 特例:Array 可以修改 ] ,并无法删除集合中的元素)

二 不可变和可变集合API

不可变(Array、List、Set)

添加

  1. //头插法
  2. newC = c.+:(item)
  3. //尾插法
  4. newC = c.:+(item)
  5. //集合拼接
  6. newC = c ++ c
  7. val li = c1 :: c2 :: Nil

特例 :不可变Set中 添加是 newS = s.+(item) ==> newS = s + item 、 删除是 newS = s.-(item) ===> newS = s - item

可变(ArrayBuffer、ListBuffer、mutable.Set)

添加

  1. //尾插法
  2. c.+=(item) ===> c += item
  3. //集合拼接
  4. val li : List[ListBuffer[Int]] = c1 :: c2 :: Nil

删除

  1. c.-=(item) ====> c -= item

三 集合

1.1 Array(不可变)

val arr : Array[Int] = Array(1,2,3) 指定一个类型(除了超类) 每个元素占据的内存空间是一样的

  1. //增
  2. arr.:+(item) //返回一个新的集合
  3. arr.+:(item)
  4. //改
  5. arr(index) = newItem
  6. //查
  7. for( item <- arr ){
  8. println(item)
  9. }

1.2 ArrayBuffer(可变)

val arr : ArrayBuffer[ Int ] = ArrayBuffer( 1 , 2 ,3 )

  1. //增
  2. arr += item //尾插法
  3. item +=: arr //头插法
  4. arr.append(item)
  5. arr.preappend(item)
  6. arr.insert(index,item)
  7. arr.insertAll(index,arr2)
  8. arr.prependAll(arr2)
  1. //删除
  2. arr.remove(index)
  3. arr.remove(index,count) // 从 index 开始 删除 count数量的元素
  4. arr -= item

相互转换

  1. arr.toArray()
  2. arr.toBuffer()

二维数组-五维数组

  1. //二维数组
  2. val array1: Array[Array[Int]] = Array.ofDim(2, 2)
  3. array1(1)(1) = item
  4. //三维数组
  5. val array2: Array[Array[Array[Int]]] = Array.ofDim(2,2,2)
  6. array2(1)(1)(1) = item

2.1 List(不可变)

image.png
image.png
image.png

val list : List [ Int ] = List( 1 , 2 , 3 )

插入元素

  1. //增
  2. list.+:(item)
  3. list.:+(item)
  1. //头插法
  2. val list2=list.::(item)
  3. /** 源码 **/
  4. //方法
  5. def :: [B >: A](elem: B): List[B] = new ::(elem, this)
  6. //类
  7. final case class :: [+A](override val head: A, private[scala] var next: List[A @uncheckedVariance]) extends List[A] {
  8. releaseFence() // java 中的本地方法
  9. override def headOption: Some[A] = Some(head)
  10. override def tail: List[A] = next
  11. }

创建集合

  1. //另类创建集合
  2. val nilList: List[Int] = Nil.::(1).::(2)
  3. println(nilList) // List(2, 1)
  4. //源码
  5. case object Nil extends List[Nothing] { //类
  6. }

合并集合

  1. //合并集合
  2. val newList = list1 ::: list2
  3. val newList1 = list1 ++ list2
  4. //源码
  5. def ::: [B >: A](prefix: List[B]): List[B] =
  6. if (isEmpty) prefix
  7. else if (prefix.isEmpty) this
  8. else {
  9. val result = new ::[B](prefix.head, this)
  10. var curr = result
  11. var that = prefix.tail
  12. while (!that.isEmpty) {
  13. val temp = new ::[B](that.head, this)
  14. curr.next = temp
  15. curr = temp
  16. that = that.tail
  17. }
  18. releaseFence()
  19. result
  20. }

访问元素

  1. //查
  2. list(index)

2.2 ListBuffer(可变)

val list : ListBuffer[ Int ] = ListBuffer( 1 , 2 , 3 )

插入元素

  1. list.append(item*)
  2. list += item
  3. item :+= list // 看到 : 从右到左执行
  4. list.prepend(item)
  5. list.insert(index,item*)

合并集合

  1. val newList = list1 ++ list2
  2. list1 ++= list2

修改元素

  1. list(index) = newItem
  2. list.update(index,newItem)

删除元素

  1. list.remove(index)
  2. list -= item

3.1 Set(不可变)

val set:Set [ Int ] = Set ( 1 , 2 , 3 )

插入元素

  1. val newSet = set + item

合并集合

  1. val newSet = set1 ++ set2

删除元素

  1. val newSet = set - item

3.2 mutable.Set(可变)

val s : Set [ Int ] = Set ( 1 , 2 , 3 )

插入元素

  1. s.add(item)
  2. s += item

删除元素

  1. s.remove(item)
  2. s -= item

合并集合

  1. s3 = s1 ++ s2
  2. s1 ++= s2

4.1 Map

val map : Map [ String , Int ] = Map ( “a” -> 1 , “b” -> 2 , “c” -> 3 )

删除元素

  1. val newMap = map.reoved(key)

访问元素

  1. map(key)
  1. map.getOrElse(key,0)
  1. val m = Map(("a",1),("b",2))
  2. for(item <- m){
  3. println(item._1)
  4. println(item._2)
  5. }
  6. for(key <- m.keys){
  7. println(key)
  8. println(m(key))
  9. }

4.2 mutable.Map

val map : mutable.Map [ String , Int ] = mutable.Map ( “a” -> 1 , “b” -> 2 )

插入元素

  1. map.put(key,value) // put底层调用的是update,如果key存在相当于就是修改 不存在就是新增

删除元素

  1. map.remove(key)
  2. map -= key

修改元素

  1. map.update(key,newValue)

访问元素

  1. map.getOrElse(key)
  2. map(key)
  3. // keys
  4. for(key <- map.keys){
  5. println(s" $key => ${map(key)}")
  6. }
  7. // values
  8. for(item <- map.values){
  9. println(item)
  10. }

合并集合

  1. map1 ++= map2

5. Tuple(长度最多22)

val tuple: (Int,String,Booleam) = ( 1, “hello” , true )

访问元素

  1. t._1 =====> t.productElement(0)

多维元组

  1. val mulTuple = ((1,0.1),2,("a",false))

四 集合常用函数

1.基本操作和常用操作

获取长度

  1. list.length()
  2. set.size()

生成字符串

  1. mkstring

2.衍生集合(返回一个新的集合)

2.1 获取集合的头

  1. list.head()

2.2 获取集合的尾(除了首个元素)

  1. list.tail()

image.png

2.3 集合最后一个元素

  1. list.last()

image.png

2.4 集合初始元素 (除了最后一个元素)

  1. list.init()

2.5 反转

  1. list.reverse()

image.png

2.6 取前(后)n 个元素

  1. //从左
  2. list.take(n)
  3. //从右
  4. list.takeRight(n)

2.7 去掉前(后)n 个元素

  1. list.drop(n)
  2. list.dropRight(n)

2.8 并集

  1. list.union(list2)

2.9 交集

  1. list.intersect(list2)

2.10 差集

  1. list.diff(list2) // list独有的,排除list和list2共有的元素

2.11 拉链

  1. list.zip(list1) // 生成二元组
  2. (item._1,item._2)

2.12 滑窗

  1. list.siding(size) //默认步长为1,每次滑动的范围
  2. list.siding(size,step)