Scala的数据结构
本文参考:扎心了,老铁
一、数组
A、定长数组和变长数组
(1)Scala代码
1 | import scala.collection.mutable.ArrayBuffer |
(2)运行结果
B、遍历数组
(1)增强for循环
(2)好用的until会生成脚标,0 until 10 包含0不包含10
(3)Scala代码
1 | def main(args: Array[String]) { |
(4)运行结果
C、数组转换
yield关键字将原始的数组进行转换会产生一个新的数组,原始的数组不变
(1)Scala代码
1 | def main(args: Array[String]) { |
(2)运行结果
D、常用数组的算法
在Scala中,数组上的某些方法对数组进行相应的操作非常方便!
二、映射(Map)
在Scala中,把哈希表这种数据结构叫做映射
A、构建映射
B、获取映射中的值
getOrElse:有就返回对应的值,没有就返回默认值
注意:在Scala中,有两种Map,
一个是immutable包下的Map,该Map中的内容不可变;
另一个是mutable包下的Map,该Map中的内容可变 (val var)
注意:通常我们在创建一个集合是会用val这个关键字修饰一个变量(相当于java中的final),那么就意味着该变量的引用不可变,该引用中的内容是不是可变,取决于这个引用指向的集合的类型
1:是否可以修改值 Mutable 可以修改map里面的值 Immutable 不可以修改里面的值
2:是否可以追加元素 Mutable var/val 都可以追加元素 Imtable var 可以追加,val不可以追加
三、元组
映射是K/V对偶的集合,对偶是元组的最简单形式,元组可以装着多个不同类型的值。
A、创建元组
B、获取元组中的值
C、将对偶的元组转换成映射
D、拉链操作
zip命令可以将多个值绑定在一起
注意:如果两个数组的元素个数不一致,拉链操作后生成的数组的长度为较小的那个数组的元素个数
四、集合
Scala 集合类系统地区分了可变的和不可变的集合。可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。而不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。
所有的集合类都可以在包scala.collection
或scala.collection.mutable
,scala.collection.immutable
,scala.collection.generic
中找到。客户端代码需要的大部分集合类都独立地存在于3种变体中,它们位于scala.collection
, scala.collection.immutable
, scala.collection.mutable
包。每一种变体在可变性方面都有不同的特征。
**scala.collection.immutable**:
包是的集合类确保不被任何对象改变。例如一个集合创建之后将不会改变。因此,你可以相信一个事实,在不同的点访问同一个集合的值,你将总是得到相同的元素。
**scala.collection.mutable**:
包的集合类则有一些操作可以修改集合。所以处理可变集合意味着你需要去理解哪些代码的修改会导致集合同时改变。
**scala.collection**:
包中的集合,既可以是可变的,也可以是不可变的。例如:collection.IndexedSeq 就是 collection.immutable.IndexedSeq 和collection.mutable.IndexedSeq这两类的超类。scala.collection
包中的根集合类中定义了相同的接口作为不可变集合类,同时,scala.collection.mutable
包中的可变集合类代表性的添加了一些有辅助作用的修改操作到这个immutable 接口。
根集合类与不可变集合类之间的区别是不可变集合类的客户端可以确保没有人可以修改集合。然而,根集合类的客户端仅保证不修改集合本身。即使这个集合类没有提供修改集合的静态操作,它仍然可能在运行时作为可变集合被其它客户端所修改。
默认情况下,Scala 一直采用不可变集合类。例如,如果你仅写了Set
而没有任何加前缀也没有从其它地方导入Set
,你会得到一个不可变的set
,另外如果你写迭代,你也会得到一个不可变的迭代集合类,这是由于这些类在从scala中导入的时候都是默认绑定的。为了得到可变的默认版本,你需要显式的声明collection.mutable.Set
或collection.mutable.Iterable
.
一个有用的约定,如果你想要同时使用可变和不可变集合类,只导入collection.mutable包即可。
1 | import scala.collection.mutable //导入包scala.collection.mutable |
然而,像没有前缀的Set这样的关键字, 仍然指的是一个不可变集合,然而mutable.Set
指的是可变的副本(可变集合)。
集合树的最后一个包是collection.generic
。这个包包含了集合的构建块。集合类延迟了collection.generic
类中的部分操作实现,另一方面集合框架的用户需要引用collection.generic
中类在异常情况中。
为了方便和向后兼容性,一些导入类型在包scala中有别名,所以你能通过简单的名字使用它们而不需要import。这有一个例子是List 类型,它可以用以下两种方法使用,如下:
1 | scala.collection.immutable.List // 这是它的定义位置 |
下面的图表显示了scala.collection
包中所有的集合类。这些都是高级抽象类或特性,它们通常具备和不可变实现一样的可变实现。
下面的图表显示scala.collection.immutable中的所有集合类。
下面的图表显示scala.collection.mutable中的所有集合类。
A、Seq
(1)不可变的序列 import scala.collection.immutable._
在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))
1 | def main(args: Array[String]): Unit = { |
(2)可变的序列 import scala.collection.mutable._
1 | def main(args: Array[String]): Unit = { |
B、Set
(1)不可变的Set
1 |
|
(2)可变的Set
1 | def main(args: Array[String]): Unit = { |