scala集合
scala同时支持不可变集合和可变集合,不可变集合可以安全的并发访问,包含有三大类,Seq序列、Set集合、Map映射
不可变集合:scala.collection.immutable
集合本身不能动态变化
可变集合:scala.collection.mutable
集合本身是可以动态变化的
在不指定确定采用哪个包时,默认采用的都是不可变集合,根据上面的继承关系可以看出,Scala的集合有三大类,序列Seq、集Set、映射Map,所有的集合都扩展自Iterator特质
数组
定长数组Array
数组定义方式一
1 | // [Int]表示泛型,表明该数组只能存放Int,如果为Any,则表示可以存放任意类型 |
数组定义方式二
在定义数组时,直接赋值
1 | // 实际上使用的是Array的apply方法 |
数组的访问
直接使用索引来进行访问数据
1 | array01(1) |
数组的赋值
直接根据索引来赋值
1 | array01(1) = 10 |
变长数组ArrayBuffer
ArrayBuffer与java的ArrayList类似,每次添加新的元素在底层都会重新分配空间,进行扩容,导致内存地址发生改变
1 | val arrBuf = new ArrayBuffer[Int] |
添加元素
可以使用addOne来添加新的元素
1 | arrBuf.addOne(10) |
修改元素
直接使用索引来修改值
1 | arrBuf(2) = 200 |
删除元素
可以根据索引来删除该索引位置的元素
1 | arrBuf.remove(0) |
数组转换
定长数组和变长数组可以相互转换,定长数组调用toBuffer方法可以转换为变长数组,变长数组调用toArray方法可以转换为定长数组
多维数组
可以使用Array调用ofDim方法来生成多维数组
1 | // 调用ofDim方法来生成多维数组 |
元组Tuple
元组可以存放各种相同或不同类型的数据,将多个无关的数据封装为一个整体,元组最多只能有22个元素
1 | // 为了高效的操作元组,编译器根据元素个数的不同,对应不同的元组类型,分别是Tuple1-Tuple22 |
元组获取值
直接根据顺序号来获取值,顺序号从1开始
1 | // 获取元组的第二个元素 |
也可以根据索引来获取,索引从0开始
1 | // 获取元组的第二个元素 |
列表List
scala中的List是一个object,是不可变的,属于Seq序列,如果需要使用可变的List,则使用ListBuffer
1 | // List是不可变的 |
Nil表示一个空列表,表示一个List()
1 | // 空列表 |
获取元素
根据索引来获取元素值,索引从0开始
1 | listInt(1) |
添加元素
在列表最后追加元素
1 | listInt :+ 4 |
在列表头部插入元素
1 | 0 +: listInt |
:在List一端 +在要添加的元素的一端
也可以使用appended方法来追加元素
1 | listInt.appended(5) |
使用::来向集合中添加元素,多个元素就可以使用::连接起来
1 | 4 :: 5 :: listInt2 |
List一定要在最右边,运算是从右向左运行的,一个一个的插入到集合的头部
1 | // 使用::是将该对象作为一个元素来插入到集合中的,如果中间有个集合,也会作为一个整体插入进去 |
使用:::可以解决将集合中的每一个元素加入到另一个元素中
1 | // 使用:::可以将集合中的每一个元素插入到另一个集合中 |
删除元素
可以使用drop或者dropRight方法来删除元素
1 | // drop表示的是从左往右开始删除几个元素 |
可变列表ListBuffer
ListBuffer是可变的List
1 | //ListBuffer是可变的List |
获取元素
使用索引获取元素,索引从0开始
1 | // 获取第一个元素 |
添加元素
在列表最后追加元素,可以使用append方法,也可以使用+=
1 | listBuffer01.append(2) |
如果需要将集合中的所有元素都追加到另一个集合,可以使用++=
1 | listBuffer01 ++= listBuffer |
使用insert方法在列表任意位置插入
1 | //第一个参数表示索引位置,第二个参数为所要插入的元素值 |
删除元素
使用remove方法根据索引来删除元素
1 | listBuffer01.remove(2) |
队列Queue
Queue是一个有序列表,遵循先入先出的原则,分为scala.collection.mutable.Queue可变队列和scala.collection.immutable.Queue不可变队列
1 | // 创建队列 |
获取元素
使用head来获取队列第一个元素
1 | queue.head |
使用last来获取队列最后一个元素
1 | queue.last |
使用tail获取除第一个元素之外的队列,tail可以级联使用queue.tail.tail
1 | queue.tail |
上述操作都不会对队列本身产生影响,并没有删除队列中的数据
添加元素
添加元素都是追加到队尾的
使用+=添加单个元素
1 | queue += 10 |
使用++=添加集合
1 | queue ++= List(2,4,6,8) |
入队操作
1 | queue.enqueue(20) |
删除元素
出队操作
1 | queue.dequeue() |
映射Map
scala的Map与java类似,但是scala中有可变的Map(scala.collection.mutable.Map)和不可变的Map(scala.collection.immutable.Map),可变的Map是无序的,不可变的Map是有序的,默认是不可变的Map
1 | println("创建方式=======") |
创建Map
可以使用->来进行k-v映射,也可以使用对偶元组
1 | // k-v映射 |
添加或修改
Map的添加操作和修改操作是一样的,如果key存在则更新,如果key不存在则添加
可以使用+=来进行添加或修改元素
1 | // key存在则更新,key不存在则添加 |
也可以使用put方法
1 | map2.put("aa",1) |
也可以通过key来直接赋值
1 | map2("aa") = 2 |
取值
取值都是根据key来进行获取的,有三种方式
可以直接根据key来获取,不过这种方式存在风险,根据key取出元素 如果key不存在则抛出异常 java.util.NoSuchElementException: key not found: bb,所以使用时需要先使用contains方法来判断key是否存在
1 | map2("bb") |
可以使用get方法来获取,使用get(key)方法来取值,如果key存在,就会返回Some(值),然后再次get就可以取到值,如果key不存在就会返回None,如果是None时再进行get操作就会抛出异常java.util.NoSuchElementException: None.get
1 | // 此时取到的是Some或者None,需要再次进行get操作 |
使用getOrElse方法来获取值,如果不存在则返回默认值
1 | map2.getOrElse("bb",0) |
删除
删除元素也有两种方式
可以使用-=来删除元素
1 | map2 -= ("a") |
也可以使用remove方法来删除
1 | map2.remove("aa") |
遍历
map的遍历多种多样,可以遍历key,可以遍历value,也可以遍历key、value,还可以遍历元组
遍历key
1 | // 遍历key |
遍历value
1 | // 遍历value |
遍历key、value
1 | // 遍历key、value |
遍历元组
1 | // 遍历元组Tuple2 |
集Set
Set是不重复的元素集合,无序,有可变Set(scala.collection.mutable.Set)和不可变Set(scala.collection.immutable.Set),默认是不可变的Set
1 | println("创建Set========") |
添加元素
set添加元素有三种方式
可以使用add方法添加元素
1 | set1.add(11) |
也可以使用+=来添加元素
1 | set1 += 13 |
+=也可以同时添加多个元素
1 | set1 += (14,15) |
删除元素
与添加元素相同,对应的也有三种删除元素的操作方式
使用remove方法删除元素
1 | set1.remove(11) |
使用-=删除元素
1 | set1 -= 13 |
同样-=也支持删除多个元素
1 | set1 -= (14,15) |