Scala的集合框架
Scala把集合框架分为3种:
1.序列:Seq
2.集:Set
3.映射:Map iterable
每一个集合都有两个包:根据包进行区别可变和不可变
1.不可变集合 scala.collection.immutable 默认的,不需要导入的
2.可变集合 scala.collecion.mutable.*
重点:元组,数组 ,List,Map,Set
元组 非常灵活
可以存储不同类型的参数
1.元组使用()封装
(1)如何创建:new Tuple(n)
(2)n:元组中存储元素的个数,但是最多只能存储22个
(3)元组下标从1开始
(4)元组的取值
①例如val tp2=new Tuple3(1,”哈哈”,2.4)
②取值:tp2._1(1),tp2._2(哈哈),tp2._3(2.4)
2.对偶元组:一种特殊的元组
例如:val tup2=(“name”,20)
Map(k,v)中的每一个元素,就是对偶元组
元组的元素交换:tup2.swap
3.拉链操作:zip zipWithIndex
例如:
scala> val teacher=Array("haiyuan","lichen","shilaoshi")
teacher: Array[String] = Array(haiyuan, lichen, shilaoshi)
scala> val tizhong=Array(100,300,200,120)
tizhong: Array[Int] = Array(100, 300, 200, 120)
scala> val nameAndtizhong=teacher.zip(tizhong)
nameAndtizhong: Array[(String, Int)] = Array((haiyuan,100), (lichen,300), (shilaoshi,200))
scala> nameAndtizhong.zipWithIndex
res8: Array[((String, Int), Int)] = Array(((haiyuan,100),0), ((lichen,300),1), ((shilaoshi,200),2))
嵌套的对偶元组
4.取嵌套三组中的元素
scala> val teacher=Array("haiyuan","lichen","shiguangxin")
teacher: Array[String] = Array(haiyuan, lichen, shiguangxin)
scala> val weight=Array(100,180,150,120)
weight: Array[Int] = Array(100, 180, 150, 120)
scala> val nameAndWeight=teacher.zip(weight)
nameAndWeight: Array[(String, Int)] = Array((haiyuan,100), (lichen,180), (shiguangxin,150))
scala> nameAndWeight.zipWithIndex
res0: Array[((String, Int), Int)] = Array(((haiyuan,100),0), ((lichen,180),1), ((shiguangxin,150),2))
//取Array中的第一个
scala> res0(0)
res2: ((String, Int), Int) = ((haiyuan,100),0)
//取嵌套元组中的第一个
scala> res2._1
res3: (String, Int) = (haiyuan,100)
//取元组的第一个元素
scala> res3._1
res6: String = haiyuan
数组
数组综述:
1.不可变数组:Array:长度不可变,内容可以变化
2.可变数组:
(1)ArrayBuffer:长度和内容都可以变化
(2)导包:scala.collection.mutable.ArrayBuffer
数组的定义方式
Array
1.Val arr:Array[Double]=Array(11.2,3.2)
(1)取值:arr(0)
(2)赋值:arr(0)=10.0
①赋值已有的元素,元素会被覆盖
2.Val arr2:Array[Int]=new ArrayInt
scala> val arr=new Array(4)
arr: Array[Nothing] = Array(null, null, null, null)
注意:
1.Nothing是报错的标识
2.Null是空的意思
ArrayBuffer(ArrayBuffer:必须导包)
scala>import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
//arrayBuffer添加或者删除元素:
scala> val arr=ArrayBuffer(1,2,3,4,7,8)
arr: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 7, 8)
scala>arr+=5
res7: arr.type = ArrayBuffer(1, 2, 3, 4, 7, 8, 5)
scala> arr++=Array(6,9)
res8: arr.type = ArrayBuffer(1, 2, 3, 4, 7, 8, 5, 6, 9)
scala> arr-=5
res9: arr.type = ArrayBuffer(1, 2, 3, 4, 7, 8, 6, 9)
scala>arr--=Array(6,8)
res10: arr.type = ArrayBuffer(1, 2, 3, 4, 7, 9)
//插入元素:insert(n:Int,m:Int*)
//插入元素的时候,插入在指定索引的前面
scala>res10.insert(5,6)
scala>res10
res13: arr.type = ArrayBuffer(1, 2, 3, 4, 7, 6, 9)
//移除元素:remove(n:Int,m:Int)
//移除元素是指定索引后几位数字
scala>res13.remove(2,3)
scala>res13
res15: arr.type = ArrayBuffer(1, 2, 6, 9)
//清空数组:clear
scala> res13.clear
scala>res13
res18: arr.type = ArrayBuffer()
//判断是否为空:isEmpty
scala> res13.isEmpty
res19: Boolean = true
scala>ab1.in注意需要按Tab,而不是Enter
indexOf indexOfSlice indexWhere indices init inits insert insertAll intersect
数组常用的方法
Max:最大值
Min:最小值
Sum:求和
Sorted:排序
Reverse:反转
scala> ab1.max
res29: Int = 5
scala> ab1.min
res30: Int = 2
scala>ab1.sum
res31: Int = 13
scala> ab1.sorted
res32: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(2, 3, 3, 5)
scala> ab1.sorted.reverse
res33: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(5, 3, 3, 2)
List
1.不可变List:长度和内容都不可变,默认的
2.可变的List:
(1)ListBuffer长度和内容都可变
(2)导包:scala.collection.mutable.ListBuffer
不可变的List
//定义方式:
scala> val list=List[Int](1,2,3,6,7)
list: List[Int] = List(1, 2, 3, 6, 7)
scala> val list1=6::4::8::Nil
list1: List[Int] = List(6, 4, 8)
3.::Nil是组成List的两个单位
Nil代表空列表
scala> List[Int]()==Nil
res1: Boolean = true
4.::方法(添加元素放在首位)
scala> 5::list
res2: List[Int] = List(5, 1, 2, 3, 6, 7)
可变的ListBuffer
//定义方式
scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer
scala> val list1=ListBuffer[Int](1,2,3)
list1: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3)
//集合基本操作
+=
++=
-+
–+
Insert
Remove
Clear
isEmpty
scala>list1+=13
res3: list1.type = ListBuffer(1, 2, 3, 13)
scala> list1++=List(12,4,5,6)
res6: list1.type = ListBuffer(1, 2, 3, 13, 12, 4, 5, 6)
scala> list1.insert(7)
scala>list1
res9: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 13, 12, 4, 5, 6)
scala>list1.remove(1)
res10: Int = 2
scala>list1.clear
scala> list1
res14: scala.collection.mutable.ListBuffer[Int] = ListBuffer()
集合间的转换
可变List:
1.通过toList()方法,转换为不可变的List
2.toBuffer 可以转化为ArrayBuffer
注意:转换后,是新的集合,不是之前的那个集合
scala> list1.toList
res20: List[Int] = List(12, 11, 1, 2)
scala>* list1.toBuffer
res21: scala.collection.mutable.Buffer[Int] = ArrayBuffer(12, 11, 1, 2)
头元素和尾元素
1.一个List元素,分为两部分:头元素(head)+尾元素(tail)
2.头元素:第一个元素
3.尾元素:除了第一个元素的其他元素都是尾元素
scala> val list=List(1,3,4,6,7)
list: List[Int] = List(1, 3, 4, 6, 7)
scala> list.head
res22: Int = 1
scala> list.tail
res23: List[Int] = List(3, 4, 6, 7)
scala> res23.tail
res24: List[Int] = List(4, 6, 7)
scala> res23.tail.tail
res25: List[Int] = List(6, 7)
Map
1.不可变的Map,默认的
2.可变的Map,导包:scala.collection.mutiable.Map
3.Map中存在的元素,都是对偶元素
4.Key是唯一的
不可变map
def main(args: Array[String]): Unit = {
// 定义形式
val mp: Map[String, Int] = Map[String, Int]("haiyuan" -> 100, "lichen" -> 300)
val mp2: mutable.HashMap[String, Int] = new mutable.HashMap[String, Int]()
// 两个map能和并吗?
val MP3 = mp ++ mp2
// 取值,跟据k取V
val m1: Option[Int] = mp.get("haiyuan")
// option some (有值) None(取不到值)
// println(mp.get("haiyuan1"))
val else1: Int = mp.getOrElse("haiyuan1", 100)
println(else1)
}
可变map(导包)
def main(args: Array[String]): Unit = {
import scala.collection.mutable.Map
import scala.collection.mutable.HashMap
val mmp: mutable.Map[String, Int] = Map[String, Int]()
// 如何添加元素
val mmp3: Option[Int] = mmp.put("haiyuan", 100)
// 还能如何添加
mmp += ("chuanwang" -> 99)
// 一下添加两个元素
mmp += (("lichen", 300), ("shilaoshi", 120))
}
}
Map迭代key和value
def main(args: Array[String]): Unit = {
val mp1: Map[String, Int] = Map[String, Int]("haiyuan" -> 120, "licheng" -> 175, "huahua" -> 88)
for (i <- mp1) {
println(i._1, i._2)
println(i._1)
println(i._2)
}
for ((k, v) <- mp1) {
println(k, v)
println(k)
println(v)
}
for ((k, _) <- mp1) {
println(k)
}
for ((_, v) <- mp1) {
println(v)
}
val ks: Iterator[String] = mp1.keysIterator
//如何遍历
while (ks.hasNext) {
println(ks.next())
}
//还能怎么做
mp1.foreach(println)
ks.foreach(println)
//迭代v
val values: Iterable[Int] = mp1.values
//遍历方式
values.foreach(println)
}
Set
集合,元素不能重复
1.不可变,长度,内容都不可变
2.可变:
(1)长度,内容都可变
(2)导包:scala.collection.mutable.Set
不可变set
scala> val set=Set(1,2,3,3,4,2,4,5)
set: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)
可变set
scala> import scala.collection.mutable.Set
import scala.collection.mutable.Set
scala> val set=Set[Int](10)
set: scala.collection.mutable.Set[Int] = Set(10)
scala> set+=12
res26: set.type = Set(12, 10)
scala> set+=11
res27: set.type = Set(12, 10, 11)
//不重复
scala> set+=11
res28: set.type = Set(12, 10, 11)
scala> set+=(11,23,45)
res29: set.type = Set(12, 45, 10, 11, 23)
scala> set++=Set(111,222)
res31: set.type = Set(12, 45, 222, 111, 10, 11, 23)
scala> set.remove(11)
res32: Boolean = true
scala> set.remove(1)
res33: Boolean = false
scala> set.head
res36: Int = 12
scala> set.tail
res37: scala.collection.mutable.Set[Int] = Set(45, 222, 111, 10, 23)
scala> set.foreach(println)
12
45
222
111
10
23
//set本身用的不多,但是我们要去重的时候,就可以用到
scala> val list=List(11,22,33,11,22,12,123,123,444)
list: List[Int] = List(11, 22, 33, 11, 22, 12, 123, 123, 444)
scala> val list1=list.toSet
list1: scala.collection.immutable.Set[Int] = Set(33, 444, 22, 12, 123, 11)
scala> list1.toList
res40: List[Int] = List(33, 444, 22, 12, 123, 11)
运算符重载的方法
scala> 3+2
res42: Int = 5
scala> 2+(4)
res43: Int = 6
scala> 1.to(10)
res44: scala.collection.immutable.Range.Inclusive = Range 1 to 10
scala> val list=List(2,3,4,51,55)
list: List[Int] = List(2, 3, 4, 51, 55)
scala> list.head
res45: Int = 2
scala> list head
res47: Int = 2
scala> list.tail
res46: List[Int] = List(3, 4, 51, 55)