SCALA程序设计 第四章:数据结构

简介: SCALA程序设计 数据结构

1、集合的特质:

   1)不可变集合:scala.collection.immutable

   2)可变集合:scala.collection.mutable

   3)Seq是一个有先后次序的值得序列。IndexedSeq能够通过整型下标快速访问元素。

   4)Set是一个没有先后次序的值集合。在SortedSort中,元素以某种排过序的顺序被访问。

   5)Map是一组键值对偶,SortedMap按照键的排序访问其中的实体。

   Scala同时支持可变集合和不可变集合,不可变集合从不可变,可以安全的并发访问。scala有限采用不可变集合。序列(List),集(Set),映射(Map)。

所有集合都扩展自Iterable特质。对于几乎所有的集合类,都同时提供了可变和不可变版本。

   每个scala集合特质或类都有一个带有Apply方法的半生对象(类似于静态方法),这个Apply方法可以用来构建该集合的实体,这种设计叫"统一创建原则"。

2、数组:

   1)定长数组,可以使用scala中的Array。

   2)变长数组,可以使用ArrayBuffer,等价于Java中ArrayList。

   3)数组转换不会修改原数组,而是产生一个新的数组,转换方式:ArrayBuffer=Array.toBuffer        Array=ArrayBuffer.toArray

   4)多维数组,通过数组的数组来实现,可以用ofDim方法。

   5)和Java互操作:scala.collection.convert.AsJavaCOnverters 或者 AsScalaConverters

3、映射:

   1)映射是key-value的集合,类似于Java中的Map。

   注意:不可变映射也可以调用方法,只不过产生新的映射。新映射和老映射共享大部分结构。可变映射是在原映射基础上进行修改。

   2)和Java互操作:JavaConversions进行转换。

4、元祖:

   1)元祖是不同类型的值的聚合

   注意:元祖是从1开始,而不是0;元祖可以用于函数需要返回不止一个值的情况,使用元祖的原因之一是把多个值绑在一起,能够被一起处理。

5、队列是先进先出的结构

6、堆栈,Stack是先进后出的结构,push进,pop出

7、列表,如果List为空,用Nil表示

8、集是不重复元素的结合。不保留顺序,默认是哈希集实现。如果想要按照已排序的顺序来访问集中的元素,可以使用SortedSet(已排序数据集),是用红黑树实现的。

9、添加去除元素操作符:Map只能加不能减

   1)向后(:+)或向前(+:)追加元素到序列中。

   2)添加(+)元素到无先后次序的集合中。

   3)用(-)移除元素。

   4)用++和--来批量添加和移除元素。

   5)对于列表,优先使用::和:::。

   6)改变操作有+=、++=、-=和--=。

   7)对于集合,我更喜欢++、&和--。

   8)尽量不要用++:、+=:和++=:。

10、将函数映射到集合:

   1)将一元函数应用于集合中的每一个元素,Map应用于集合中的每一个元素,并产生转换后的新元素,FlatMap同样用于集合中的每一个元素,并对于每一个元素产出一个集合,并将集合中的元素串接在一起。

11、化简、折叠、扫描:

   1)化简、折叠:将二元函数应用于集合中的元素。

   2)扫描是化简和折叠的结合,包含所有中间结果的集合。

12、拉链操作:作用于两个集合,将对应的元素合并成一个元祖。

13、迭代器:通过Iterator方法从集合获得一个迭代器,通过while或for表达式对集合进行遍历。

14、流:Stream只有在需要的时候才回去计算下一个元素,是一个尾部被懒计算的不可变列表。

   1)#:: 操作符用于返回流。

15、懒视图:

   1)看到Stream的懒执行行为,你可以对其他集合应用View方法来得到类似的效果,该方法产出一个其方法总是被懒执行的集合。但是View不会缓存数据,每次都要重新计算。

16、线程安全的集合:

   1)多线程进行集合操作时,并发问题很突出,scala类库提供了6个并发特质,可以混入这些集合,让操作变成同步

       1、SyncharonizedBuffer

       2、SyncharonizedMap

       3、SyncharonizedPriorityQueue

       4、SyncharonizedQueue

       5、SyncharonizedSet

       6、SyncharonizedStack

17、并行集合

   1)scala充分使用多核CPU,提供并行集合,用于并行计算,主要算法:

       1、Divide and conquer:分治算法,通过splitters,combiners等抽象层来实现,主要原理是将计算工作分解很多任务,分发给一些处理器去完成(并将它们处理结果合并返回)

       2、Work stealing算法:用于任务调度负载均衡(load-balancing),通俗点完成自己的所有任务之后,发现其他人还有活没干完,主动(或被安排)帮他人一起干,达到尽早完成目的。

   并行集合位于scala.collection.parallel,跟普通集合(regular collection)一样,分immutable和mutable。通过par关键字将集合转换为一个并行集合,并行集合类型为扩展自ParSeq、ParSet、ParMap特质的类型,

   所有特质都是ParIterable的子类型,但并不是Iterable的子类型,所以不能将并行集合传递为预期的Iterable、Seq、Set或Map方法,可以通过ser方法将并行集合转换回串行集合。

       注意:在并行任务里面,不要同时更新一个共享变量。

18、操作符概述:

   1)如果想在变量名、类名等定义中用保留字,可以用反引号。

   2)这种形式叫中置操作符, A 操作符 B 等同于 A.操作符(B)

   3)后置操作符, A 操作符 等同于 A.操作符 , 如果操作符定义的时候不带()则调用时不能加()

   4)前置操作符,+、-、!、~等 操作符 A 等同于 A.unary_操作符

   5)赋值操作符, A 操作符=B 等同于 A=A 操作符 B


相关文章
|
存储 Java 数据安全/隐私保护
java数据结构基于哈希表的学生通讯录程序设计
利用哈希表的思想设计一个能快速查询的学生通讯录程序。每个学生的信息至少包括:学号(10个数字)、姓名(不超过20字符)、手机号码(11个数字)。程序主要功能:从键盘输入学生通讯录,以学号为关键字建立哈希表,酌情设计哈希函数和处理冲突的策略;采用哈希表方法根据输入的学号显示该学生的通讯录信息;能够修改学生的手机号码;能够添加和删除某个学生的通讯录信息。
114 0
|
算法
江苏大学 程序设计与算法/算法设计与分析/数据结构与算法/程序设计与数据结构 期末/考研复试复习
江苏大学 程序设计与算法/算法设计与分析/数据结构与算法/程序设计与数据结构 期末/考研复试复习
181 0
江苏大学 程序设计与算法/算法设计与分析/数据结构与算法/程序设计与数据结构 期末/考研复试复习
|
Java 编译器 Scala
SCALA程序设计 第三章:控制结构和函数
SCALA程序设计 控制结构和函数
|
Java Scala
|
安全 JavaScript 前端开发
SCALA程序设计 第一章:scala简介
Scala是一门静态类型语音,是一门以Java虚拟机为目标运行环境并将面向对象和函数式编程语言的最佳特性结合在一起的编程语言。
214 0
|
算法 C++
数据结构 实践项目——数据结构、算法、程序设计
【项目1 - C/C++语言中函数参数传递的三种方式】   C语言提供了两种函数参数传递的方式:传值和传地址。在C++中,又拓展了引用方式。通过本项目,确认自己已经掌握了这三种方式的原理,为后续学习做好准备。   下面是希望能够交换两个整型变量的swap函数的三个版本(从课程主页中可以找到项目链接,复制后就能调试,不必费事敲代码): //(1)传值 void mys
1525 0
|
算法 测试技术 C++
C++程序设计-第15周 数据结构扩展与GUI开发体验
课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 【目的】 1. 体验用面向对象的方法操作数组和动态链表2. 体验窗口程序的实现第一部分 引言  大学中的学习死守着课本非常的没有劲。我不是说课本和课堂没用,而是说在课内的学习之余要有所拓展和扩充。大学的课程(和课本)成为一个体系,受到各种因素的制约,势必会形成一个框框
1994 0