Scala集合

本文深入解析Scala中的集合体系,包括不可变集合与可变集合的区别,数组、ArrayBuffer、Map、List等数据结构的使用方法及特性,以及元组的创建与操作。探讨了集合在Scala中的实现原理,如indexedSeq和LinearSeq的区别,以及如何进行高效的数据操作。
摘要由CSDN通过智能技术生成

集合

小结

1、set,map是java中也有的集合

2、seq是java中没有的,并且list归属到了seq中,因为这里的list与java不是一个概念

3、例如 1 to 3,就是indexedSeq下的Vector

4、String也属于indexedSeq

5、经典的数据结构,比如Queue(队列)、Stack(栈) 被归属到了LinerSeq

6、Scala 中Map体系中有SortedMap,说明scala的map支持排序

7、indexedSeq和LinearSeq的区别

  • indexedSeq 是通过索引来定位于查找元素的,因此速度快,比如,String就是一个索引集合,通过索引即可定位
  • LinearSeq 是线性的,即有头尾的概念,这种数据结构一般是通过遍历查找的,一般是体现

集合体系结构

不可变集合

在这里插入图片描述

可变集合

在这里插入图片描述

数组

定长数组

第一种定义方式
val arr1 = new Array[Int](10)
//使用小括号获取元素值
arr1(7)
第二种定义方式
//如果变量类型不一致,则泛型为 Any
val arr1 = Array(1,"abc",1.1)

//使用索引方式变量
for(index<-0 until arr1.length){
    println(arr1(index))
}

变长数组

定义

import scala.collection.mutable.ArrayBuffer
    var muArr = ArrayBuffer[Int]()
    //追加一个值到变长数组
    muArr += 10
    muArr += 15
    //追加多个值到变长数组
    muArr.append(10,20,30)
    
    //修改
    muArr(1)=30
    
    //删除,根据下标删除
    muArr.remove(0)
    println(muArr)

Array与ArrayBuffer的相互转换

arr1.toBuffer //定长转变长数组
arr2.toArray  //变长转定长

说明
arr1.toBuffer 返回的结果才是一个变长数组,arr1本身没有变化
arr2.toArray 返回的结果才是一个定长数组,arr2本身没有变化

二维数组

 //创建二维数组  三行四列
    val arr2 = Array.ofDim[Int](3,4)
    //遍历
    for (item<-arr2){ //取出二维数组的第一维
      for(it <- item) print(it+"\t")
      println()
    }

    //取出指定元素
    println(arr2(1)(1))

    //修改值
    arr2(1)(1) = 100
    
    for (item<-arr2){ //取出二维数组的第一维
      for(it <- item) print(it+"\t")
      println()
    }

ArrayBuffer转Java的List互转

    //scala转java
    var arr3 = ArrayBuffer[String]("1","2","3")
    import scala.collection.JavaConversions.bufferAsJavaList
    var javaArr = new ProcessBuilder(arr3)
    var arrList = javaArr.command()
    println(arrList)
    
    //java转scala
    import scala.collection.JavaConversions.asScalaBuffer
    import scala.collection.mutable
    var scalaArr:mutable.Buffer[String] = arrList
    scalaArr.append("java")
    println(scalaArr)

Map

map的说明

    //如下代码,使用 var 定义的map集合,在+=操作时,实际上是返回了一个新的Map从
    新赋值给了原来的map 
    var map = Map(1->"aaa",2->"bbb")
    //1763842505
    println(map.hashCode())
    //-1968654784
    map += (2->"qqq")
    println(map.hashCode())
    map +=(3->"mmm")
    //-1311662402
    //可以看出,每次修改后map的地址值都发生了改变

map取值

方式1
map(key)

key存在返回中,key不存在抛异常

方式2
map.contains(key)判断key是否存在

方式3
map.get("A") //返回Some
要想取值,还需再get
map.get("A").get

方式4
//有传入的key则输出对应的值,没有则返回默认值
map.getOrElse("A","默认值")

map删除

    map2.remove(key)
    map2 -= (key)

map遍历

for((k,v)<-map) printf("key=%s,value=%d",k,v)

for(k<-map.keys) println(k)

for(v<-map.values) println(v)

//类型是Tuple2
for(v<-map) println(v+"key="+v._1)

元组

元组也可以理解为一个容器,可以将不同类型的数据放到一起,简单的说就是将无关的数据封装为一个整体,称为元组,元组本身比较灵活,对数据本身没有太大要求

注意:元组最大只能存22个元素

元组的创建,取值,遍历

    //创建
    val aaa=(1,"dsad",1.2,true)
    //取值    
      println(aaa._2)
    //遍历
    for(i<-aaa.productIterator){
      println(i)
    }

List

默认创建的List是不可变的

val list = List(1,2,3,"hello")
var list2 = Nil //返回一个空集合

//取值
println(list(1))

//追加元素(这种追加只是返回一个新的List并没有破坏不可变性)
//通过 :+ 或者 +:给list追加元素(本身集合没有变化)

var list3 = List(1,2,3,"abc")

//list永远在冒号一侧
var list4 = list3 :+ 4 //在list3后面追加一个4
var list5 = 6 +: list3  //在 list3的最前面 追加了一个 6

println(list3) // 没有任何变化
println(list4)

List的符号使用

1、符号 :: 表示向集合中新建集合添加元素
2、运算时,集合对象一定要放在最右边
3、运算规则,从右向左
4、::: 运算符是将集合中的每个元素加入到空集合中去


// :: 使用说明
val list = List(1,2,3,"abc")
var list2 = 4::5::6::7::list::Nil
println(list2)
//输出结果为List(4, 5, 6, List(1, 2, 3, abc))
//1、List()
//2、List(List(1,2,3,"abc"))
//3、List(6,List(1,2,3,"abc"))
//4、List(5,6,List(1,2,3,"abc"))
//5、List(4,5,6,List(1,2,3,"abc"))



//::: 使用说明(将list扁平化后放入空 list中)
val list3 = 4 :: 5 :: 6 :: list ::: Nil
//输出结果 List(4, 5, 6, 1, 2, 3, abc)

ListBuffer

可变的list集合

import scala.connection.mutable.ListBuffer

var listBuf = ListBuffer[Int](1,2,3)

//访问
println(listBuf(1))

//遍历
for(item<-listBuf){
    println(item)
}

//动态增加元素  listBuf 会发生改变
listBuf += 4 //动态追加 单个元素
listBuf.append(5,6,7)  //动态追击多个元素

//把一个集合追加到另一个集合
var listBuf2 = new ListBuffer[Int](7,8)
listBuf ++= listBuf2

val listBuf3 = listBuf2:+5 //将listBuf2后面追加5并返回一个新ListBuffer


//删除
listBuf2.remove(1) //下标


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值