纸上得来终觉浅,绝知此事要躬行!
列表 List-创建List
基本介绍:Scala中的List 和Java List 不一样,在Java中List是一个接口,真正存放数据是ArrayList,而Scala的List可以直接存放数据,就是一个object,默认情况下Scala的List是不可变的,List属于序列Seq。
val List = scala.collection.immutable.List
object List extends SeqFactory[List]
搜图
编辑
请输入图片描述
创建List的应用案例
val list1 = List(1, 2, 3) //创建时,直接分配元素
println(list1)
val list2 = Nil //空集合
println(list2)
创建List的应用案例小结
1)List 在 scala包对象声明的,因此不需要引入其它包也可以使用,List 默认是不可变的的集合
2)val List = scala.collection.immutable.List
3)List 中可以放任何数据类型,比如 arr1的类型为 List[Any]
4)如果希望得到一个空列表,可以使用Nil对象, 在 scala包对象声明的,因此不需要引入其它包也可以使用
val Nil = scala.collection.immutable.Nil
增加:向列表中增加元素, 会返回新的列表/集合对象。注意:Scala中List元素的追加形式非常独特,和Java不一样。
方式1-在列表的最后增加数据 list1 :+ 8
方式2-在列表的最前面增加数据8 +: list1
方式3-在列表的最后增加数据
1)符号::表示向集合中 新建集合添加元素。
2)运算时,集合对象一定要放置在最右边,
3)运算规则,从右向左。
4)::: 运算符是将集合中的每一个元素加入到空集合中去,两边都是集合
搜图
编辑
请输入图片描述
访问:
val value1 = list1(1) // 1是索引,表示取出第2个元素.
println(value1)
搜图
编辑
请输入图片描述
ListBuffer
ListBuffer是可变的list集合,可以添加,删除元素,ListBuffer属于序列
//追一下继承关系即可
创建:Seq var listBuffer = ListBuffer(1,2)
访问:listBuffer (1)
遍历 for (item <- listBuffer ) {println(“item=” + item)}
追加:listBuffer += 4 或者 listBuffer .append(5) 直接改变的listBuffer
list0 = list1 或者 var list2= list0 ++list1 //每个元素添加到list0
删除 list1.remove(1)
队列 Queue-基本介绍,队列的说明:
1)队列是一个有序列表,在底层可以用数组或是链表来实现。
2)其输入和输出要遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出
3)在Scala中,由设计者直接给我们提供队列类型使用。
4)在scala中, 有 scala.collection.mutable.Queue 和 scala.collection.immutable.Queue , 一般来说,我们在开发中通常使用可变集合中的队列。
import scala.collection.mutable
//说明: 这里的Int是泛型,表示q1队列只能存放Int类型
//如果希望q1可以存放其它类型,则使用 Any 即可。
val q1 = new mutable.Queue[Int]
println(q1)
追加:
list+= 20
list+= List(1,2,3) //整个加进去
list++= List(2,4,6) //list中每个加进去
入队列:list.enqueue(9, 8, 7) //按照队列的算法,会将数据添加到队列的最后
出队列:list.dequeue() //按照进入队列的顺序删除元素(队列先进先出
队列 Queue-返回队列的元素
返回队列的第一个元素:println(list.head) //对队列本身没有任何影响
返回队列最后一个元素:println(list.last) //对队列本身没有任何影响
返回队列的尾部:即:返回除了第一个以外剩余的元素, println(list.tail)
级联使用:这个在递归时使用较多:println(list.tail.tail)
映射 Map-基本介绍
Java中的Map回顾:HashMap是一个散列表(数组+链表),它存储的内容是键值对(key-value)映射,Java中的HashMap是无序的,key不能重复。
搜图
编辑
请输入图片描述
Scala中的Map介绍
1)Scala中的Map 和Java类似,也是一个散列表,它存储的内容也是键值对(key-value)映射,Scala中不可变的Map是有序的,可变的Map是无序的。
2)Scala中,有可变Map (scala.collection.mutable.Map) 和 不可变Map(scala.collection.immutable.Map)
方式1-构造不可变映射
Scala中的不可变Map是有序,构建Map中的元素底层是Tuple2类型。
创建:val map1 = Map(“Alice” -> 10, “Bob” -> 20, “Kotlin” -> “北京”)
注意:.从输出的结果看到,输出顺序和声明顺序一致.构建Map集合中,集合中的元素其实是Tuple2类型.默认情况下(即没有引入其它包的情况下),Map是不可变map.为什么说Map中的元素是Tuple2 类型 [反编译或看对应的apply]
方式2-构造可变映射
//需要指定可变Map的包,从输出的结果看到,输出顺序和声明顺序不一致
val map2 = scala.collection.mutable.Map(“Alice” -> 10, “Bob” -> 20, “Kotlin” -> 30
方式3-创建空的映射
val map3 = new scala.collection.mutable.HashMap[String, Int]
println(map3)
方式4-对偶元组
即创建包含键值对的二元组, 和第一种方式等价,只是形式上不同而已。对偶元组 就是只含有两个数据的元组。
val map4 = mutable.Map( (“A”, 1), (“B”, 2), (“C”, 3),(“D”, 30) )
映射 Map-取值
方式1-使用map(key)
val value1 = map2(“Alice”)
println(value1)
说明:如果键存在, 返回对应的值对象, 如果键不存在, 抛出异常, 在java中 如果不存在返回null
方式2-使用contains方法检查是否存在key
// 返回Boolean,如果key存在,则返回true,如果key不存在,则返回false
map4.contains(“B”)
说明:使用containts先判断在取值,可以防止异常,并加入相应的处理逻辑
方式3-使用map.get(key).get取值
通过 映射.get(键) 这样的调用返回一个Option对象,要么是Some,要么是None
var map4 = mutable.Map( (“A”, 1), (“B”, “北京”), (“C”, 3) )
println(map4.get(“X")) //None
println(map4.get(“X").get) //得到Some在取出
方式4-使用map4.getOrElse()取值
getOrElse 方法 : def getOrElse[V1 >: V](key: K, default: => V1)
说明:如果key存在,返回key对应的值,如果key不存在,返回默认值。在java中底层有很多类似的操作。
如何选择取值方式建议
1)如果我们确定key是存在的,应该使用map(“key”) ,速度快.
2)如果我们不确定key是否存在, 而且在不存在时,有业务逻辑处理就是用map.contains() 配合 map(“key”)
3)如果只是简单的希望返回一个值,就使用getOrElse()
映射 Map-对map修改、添加和删除
更新map的元素
搜图
编辑
请输入图片描述
说明:1)map 是可变的,才能修改,否则报错
2)如果key存在:则修改对应的值,key不存在,等价于添加一个key-val
添加map元素
搜图
编辑
请输入图片描述
删除map元素
搜图
编辑
请输入图片描述
l映射 Map-对map遍历: 对map的元素(元组Tuple2对象 )进行遍历的方式很多,具体如下:
val map1 = mutable.Map( (“A”, 1), (“B”, “北京”), (“C”, 3) )
for ((k, v) <- map1) println(k + " is mapped to " + v)
for (v <- map1.keys) println(v)
for (v <- map1.values) println(v)
for(v <- map1) println(v)
or(v<-map1) println(v+“key=”+v._1+“val=”+v._2)//v是Tuple?
说明:每遍历一次,返回的元素是Tuple2,取出的时候,可以按照元组的方式来取
集 Set-基本介绍:集是不重复元素的结合。集不保留顺序,默认是以哈希集实现
Java中Set的回顾:java中,HashSet是实现Set接口的一个实体类,数据是以哈希表的形式存放的,里面的不能包含重复数据。Set接口是一种不包含重复元素的 collection,HashSet中的数据也是没有顺序的。案例演示:
搜图
编辑
请输入图片描述
Scala中Set的说明:默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包
lSet集合-创建
搜图
编辑
请输入图片描述
可变集合的元素添加
mutableSet.add(4) //方式1
mutableSet += 6 //方式2
mutableSet.+=(5) //方式3
如果添加的对象已经存在,则不会重复添加,也不会报错
可变集合的元素删除
val set02 = mutable.Set(1,2,4,“abc”)
set02 -= 2 // 操作符形式
set02.-=(4) // ok
set02.remove(“abc”) // 方法的形式,scala的Set可以直接删除值
println(set02)
遍历: for (x <- set02) { println(x) }
学习使人进步,共勉!加油!