Scala集合及其相关操作

Scala集合及其相关操作

1,简介

1)Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质。

2)对于几乎所有的集合类,Scala都同时提供了可变不可变的版本,分别位于以下两个包

​ 不可变集合:scala.collection.immutable

​ 可变集合: scala.collection.mutable

3)Scala不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而不会对原对象进行修改。类似于java中的String对象

4)可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类似于java中StringBuilder对象

建议:在操作集合的时候,不可变用符号,可变用方法

2、数组

2.1 不可变数组

  1. 创建数组
//1.new的方式
val arr1: Array[Int] = new Array[Int](5)
//2.使用伴生对象
val arr2: Array[Int] = Array(1,2,3,4,5)
  1. 访问数组
println(s"${arr1(0)} ${arr1.apply(1)} ${arr1(2)} ${arr1(3)} ${arr1(4)}" )
//Array数组的读写(仅支持更新操作)
arr1(3) = 13
arr1.update(0, 48) //arr1(0)=48 
println(arr1.mkString(" "))

3) 遍历所有元素

//1	for循环遍历
for( i <- 0 until arr2.length ) print(arr2(i) + "\t")
//简化
for( i <- arr2.indices ) print(arr2(i) + "\t")
//2	for循环直接遍历元素
for( elem <- arr2 ) print(elem + "\t")
//3 迭代器
val iter: Iterator[Int] = arr2.iterator
while(iter.hasNext) print(iter.next() + "\t")
//4 foreach方法
arr2.foreach( elem => print(elem + "\t") )
arr2.foreach( println )

4) 向数组中添加元素

//生成一个新的数组,原数组不变
//末尾添加元素
val newArr1: Array[Int] = arr2.:+(20)
val newArr2: Array[Int] = arr2 :+ 30
//开头添加元素
val newArr3: Array[Int] = 40 +: arr2

2.2 可变数组

1) 创建一个可变数组

//
val arr1: ArrayBuffer[Int] = new ArrayBuffer[Int]()
val arr2: ArrayBuffer[Int] = ArryaBuffer(1,2,3,4,5)

2) 访问数组元素进行读写操作

//
println(arr2(1))
arr2(0) = 12 //== arr2.update(0,2)

3) 向数组中添加元素

//
arr1.append(23)
//一次添加多个,默认添加到末尾
arr1.append(35, 71)
arr2 += 23 += 25
//向数组前面添加元素
arr1.prepend(8, 13)
37 +=: arr2
//在第X下标开始插入,一个或者多个元素
arr1.insert(1, 46, 92)

4) 删除元素

//按照索引位置删除,返回所删除的元素
val a = arr2.remove(2)
// 按元素值删除
arr2 -= 23

5) 增加另一个数组的所有元素

//
arr2.appendAll( ArrayBuffer(27,47,80) )
arr2 ++=: arr1

6) 可变数组和不可变数组的转换

//转不可变数组
val arr: ArrayBuffer[Int] = ArrayBuffer(2,4,7)
val newArr: Array[Int] = arr.toArray
//转为可变数组s
val buffer = newArr.toBuffer

2.3多维数组

1) 创建一个数组

//
val arr: Array[Array[Int]] = Array.ofDim[Int](2, 3)

2) 访问数组中元素,进行读写

//
println(arr(1)(0))
arr(1)(0) = 27

3) 遍历数组

//
for( i <- 0 until arr.length; j <- 0 until arr(i).length ) println(arr(i)(j))
//
for( i <- arr.indices; j <- arr(i).indices ) {
      print(arr(i)(j) + "\t")
      if( j == arr(i).length - 1 ) println()
    }
//
arr.foreach( line => line.foreach( elem => println(elem) ) )
arr.foreach( _.foreach( println ) )

3、Seq集合(List)

3.1 不可变List

1) List默认为不可变集合

2) 创建一个List(数据有顺序,可重复)

//
val list1: List[Int] = List(23, 45, 67, 91)

3) 遍历List

//
list8.foreach( println )
for( elem <- list1 ) println(elem)

4) List增加数据

//updated方法使用后得到一个新数组
list1.updated(1,2)
//添加元素,得到一个新的list
val list2 = 12 +: list1
val list3 = list2 :+ 39
//添加到头部
val list5 = list1.::(50)

5) 集合间合并:将一个整体拆成一个一个的个体,称为扁平化

//
val list6 = list4 :: list5
//List(List(70, 28, 17), 50, 23, 45, 67, 91)
val list7 = list4 ::: list5
//List(70, 28, 17, 50, 23, 45, 67, 91)

6) 取指定数据

println(list1(0))

7) 空集合Nil

//空列表以及创建列表的另一种方法
val list4 = 70 :: 28 :: 17 :: Nil

3.2 可变ListBuffer

1) 创建可变列表

//
val list1: ListBuffer[Int] = new ListBuffer[Int]()
val list2 = ListBuffer(34, 53, 68, 91)

2) 添加元素

list1.append(10, 25)
list1 += 18 += 49
list1.prepend(36)
12 +=: list1 
list1.insert(1, 20)

3) 合并两个列表

//++:创建一个新的缓冲区。使用“ ++ =”从此缓冲区添加元素并返回该缓冲区本身
val list3 = list1 ++ list2
//使用++=添加合并两个列表
list1 ++= list2
list1 ++=: list2

4) 删除元素

//引用要删除的第一个元素的索引,要删除的元素数
list3.remove(1, 3)
//要删除的元素
list2 -= 34

5) 访问和修改元素

//修改元素
list3(2) = 100
list3.update(5, 168)

4、set

不可变Set

    // 1.  创建Set
    val set1: Set[Int] = Set(4, 5, 7, 9, 21, 36, 5, 22, 21)

    // 2. 添加元素,得到一个新的set
    val set2 = set1 + 29 + 17 + 40

    // 3. 合并set,得到一个新的set
    val set3 = Set(13, 17, 129)
    val set4 = set2 ++ set3

    // 4. 删除元素
    val set5 = set4 - 21

可变set

    // 1. 创建set
    val set6: mutable.Set[Int] = mutable.Set(4, 5, 7, 9, 21, 36, 5, 22, 21)

    // 2. 添加元素
//    val set7 = set6 + 45

    set6 += 45 += 123
    val flag1 = set6.add(45)

    // 3. 删除元素
    set6 -= 7
    val flag2 = set6.remove(4)
    val flag3 = set6.remove(1)

    // 4. 合并两个set
    val set7 = mutable.Set(2, 3, 56, 78)
    set6 ++= set7
	//求并集
    val set8 = set6.union(set7)

    // 5. 遍历
    for( elem <- set6 ) println(elem)
    set6.foreach( println )

5、Map

不可变map

// 1. 创建一个map
    val map1 = Map("a" -> 1, "b" -> 12, "c" ->32, "d" -> 25)

    // 2. 访问数据
//    println(map1.get("b"))
    println(map1("b"))
    println(map1.getOrElse("e", 0))

    // 3. 遍历所有元素
    map1.foreach( println )
    map1.foreach( (elem: (String, Int)) => println(elem) )
	//返回kv
    for( kv <- map1 ) println(kv)
	//返回key
    for( key <- map1.keys ) print(key + "\t")
	//返回value
    for( value <- map1.values ) print(value + "\t")

可变map

 // 1. 创建
    val map2 = mutable.Map("a" -> 1, "b" -> 12, "c" ->32, "d" -> 25)

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

    // 2. 添加元素
    map2.put("e", 219)

    map2 += ("f" -> 123)
    map2 += (("g", 27))
    println(map2)

    // 3. 删除元素
    map2.remove("d")
    map2 -= "a"

    // 4. 修改map中value值
    map2.update("a", 29)
    map2("a") = 30
    map2("b") = 15

    // 5. 合并两个map
	//++ 返回一个新的map
    val map3 = map1 ++ map2
    val map4 = map2 ++ map1
	//加到map2zhong 
    map2 ++= map1

6、Tuple

 // 1. 创建元组
    val tuple1 = Tuple3[Int, String, Boolean](129, "hello", true)
    val tuple2: (Int, String, Boolean) = (129, "hello", true)

    // 2. 元组和map
    val map = Map(("a", 1), ("b", 12), "c" ->32, "d" -> 25)

    // 3. 访问元组中元素
    println(tuple1._1)
    println(tuple2.productElement(0))
    println(tuple1._3)

    // 4. 遍历访问元素
    for( elem <- tuple2.productIterator ) println(elem)

    // 5. 嵌套元组
    val tuple3: (Int, Double, (String, Boolean), Char) =
      (12, 0.5, ("hello", true), 'c')

    println(tuple3._3._1)
val map = Map(("a", 1), ("b", 12), "c" ->32, "d" -> 25)

// 3. 访问元组中元素
println(tuple1._1)
println(tuple2.productElement(0))
println(tuple1._3)

// 4. 遍历访问元素
for( elem <- tuple2.productIterator ) println(elem)

// 5. 嵌套元组
val tuple3: (Int, Double, (String, Boolean), Char) =
  (12, 0.5, ("hello", true), 'c')

println(tuple3._3._1)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值