Scala核心编程 集合(Seq,list,set,Map)

纸上得来终觉浅,绝知此事要躬行!

列表 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) }

学习使人进步,共勉!加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

研程序笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值