一.本章要点

  • 所有集合都扩展自Iterable特质;
  • 集合有三大类,分别为序列,集和映射;
  • 对于几乎所有集合类,Scala都同时提供可变和不可变的版本;
  • Scala列表要么是空的,要么拥有一头一尾,其中尾部本身是一个列表;
  • 集是无小猴次序的集合;
  • 用LinkedHashSet来保留插入顺序,或者用SortedSet来顺序进行迭代;
  • +将元素添加到无先后次序的集合中;+:和:+向前或向后追加到序列;++将两个集合串接在一起;-和--移除元素;
  • Iterable和Seq特质有数十个用于常见操作的方法。在编写冗长繁琐的循环之前,先看看这些方法是否满足你的需要;
  • 映射、折叠和拉链操作是很有用的技巧,用来将函数或操作应用到集合中的元素    

二.主要的集合特质

  Scala集合继承等级中重要的特质:

  Iterable:是指那些能生成用来访问集合中所有元素的Iterator的集合,如下:

//这是遍历一个集合最基本的方式
val coll=...//某种Iterable
val iter=coll.iterator
while(iter.hasNext)
....

  Seq:有先后次序的值的序列,如数组,列表等。IndexedSeq允许我们通过整型的下标访问任意元素。

  Set:一组没有先后次序的值,在sortedSet中,元素以某种排过序的顺序访问。

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

  继承等级和Java相似,有一些改进:

    映射隶属于同一个继承等级而不是单独的层级关系;

    IndexedSeq是数组的超类型,但不是列表的超类型,以便于区分

  注:统一创建原则:Scala每个集合特质或类都有一个带有apply方法的伴生对象。

三.可变和不可变集合

  Scala有可变的也有不可变的集合,优先采用不可变集合。scala.collection包中的伴生对象产生出不可变集合,且scala包和Predef对象指向不可变特质的类型别名List,Set,Map,如Predef.Map和scala.collection.immutable.Map。  

四.序列

  

不可变序列

  vector是ArrayBuffer的不可变版本:一个带下标的序列,支持快速的随机访问。向量是以树形结构的形式实现的。每个节点可以有不超过32个字节点。对于100万个元素,只需要访问四层节点(10^6=32^4),在链表中需要500000跳。

  Range表示一个整数序列,用to和until构造。

  

可变序列 

  栈,队列,优先级队列。。。链表有些特殊

五.列表

  在Scala中,列表要不是空表(Nil),要不是一个head元素加上一个tail,二tail又是一个列表。

  如val digits=List(4,2),digits.head为4,digits.tail是List(2),dights.tail..head=2,dights.tail.tail=Nil。

  ::操作符从给定的头和尾创建一个新的列表,且::是右结合的,如9::List(4,2)得List(9,4,2)

  遍历链表:可以使用迭代器,使用递归,模式匹配。。。

  

//递归
def sum(lst:List[Int]):Int=
if(lst=Nil) 0 else lst.head+sum(lst.tail)
//模式匹配
def sum(lst:List[Int]):Int=lst match{
case Nil=>0
case h::t=>h+sum(t)
}

六.可变列表

  可变的LinkedList和不可变的List相似,可以通过对elem引用赋值来修改其头部,对next引用赋值修改其尾部。    

七.集

  集是不重复元素的集合,是无序的(缺省情况下是哈希表实现的)。[允许集对它们从新排列,块]

  链式哈希可以记住元素插入顺序,会维护一个链表来达到这个目的(LInkedHashSet);

  按照以排序的方式访问集中的元素(SortedSet),红黑树实现。

  位集是集的一种实现,以一个字位序列的方式存放非负整。

  contains方法检查某个集是否包含给定的值,subsetOf检查某个集当中的所有元素是否被另一个集包含。union(++)、intersect(--)、diff是常用的操作,也可以写作|、&,&~ 。 

八.用于添加或去除元素的操作符

 

九.常用方法

  Iterable重要方法:

  Seq特质重要的方法:

  

  注:这些方法都不改变原有集合,而是返回与原有集合相同类型的集合,这叫”统一返回类型“原则。

十.将函数映射到集合

  例如map,filter等等。

  flatMap产出一个集合而不是一个值。

  collect用于偏函数——没有对所有可能输入值进行定义的函数。

十一.化简、折叠和扫描

  二元函数组合集合中的元素。如List(1,7,2,9).reduceLeft(_ - _)得((1-7)-2)-9=-17,同样Left(1,7,2,9).reduceRight(_ - _)得1-(7-(2-9))=-13,List(1,7,2,9).foldLeft(0)(_ - _)得0-1-7-2-9=-19(可以用:/来写foldLeft)。

  折叠有时候可以替换循环,如计算字母出现频率,一种是遍历这个字符串然后更新映射,另一种是将频率映射和新遇到的字母结合产生一个新的频率映射,这就是折叠,例:

(Map[Char,Int]()/:"TESthahaLYq"){
(m,c)=>m+(x->(m.getOrElse(c,0)+1))
}

十二.拉链操作

  将两个集合相互对应的元素结合在一起。如果两个集合长度不一致,zip则按短的来;zipAll会让你指出较短列表的缺省值zipWithIndex返回对偶的列表。

十三.迭代器

  可以用iterator方法从集合中获得一个迭代器(hasext(),next()等方法,遍历一次该迭代器九不能使用了),减少代价,但是迭代器很脆弱,每次对next的调用都会改变迭代器的指向。

十四.流

  流提供的是一个不可变的替代品(尾部被来计算的不可变的列表),这是懒执行的,只有当用到时才会执行。

  使用#::来构建一个流,例def numsFrom(n:BigInt):Stream[BigInt]=n #::numsFrom(n+1)。

十五.懒视图

  可以对其他集合应用view方法得到同样懒执行的效果,例:val power=(0 until 1000).view.map(pow(10,_))将产出一个未被求值的集合,再次调用会从新计算。(对于处理那种需要以多种方式进行交换的大型集合很有好处,避免了构建大型中间集合的需要)。

十六.与Java集合的互操作

  使用JavaConversions对象转换,转换转出的都是包装器。

十七.线程安全的集合

  当多个线程访问一个可变集合时,确保自己不会在其他线程正在访问它时修改,可以用六个特质同步:

  最好使用java.util.concurrent中的ConcurrentHashMap或ConcurrentSkipListMap。

十八.并行集合

  并行集合coll,如并发的求和coll.par.sum,对数组、缓冲、哈希表、平衡树而言,并行实现会直接重用底层实际集合的实现,很高效。

  例:一个是顺序产出,一个是按产出顺序

 注:如果并行运算修改了共享的变量,则结果无法预知;

    par方法返回的并行集合的类型为扩展自ParSeq、ParSet或ParMap特质的类型,所有这些特质都是ParIterable的子类型,但并不是Iterable的子类型,因此不能将并行集合传递给预期的Iterable、Seq、Set或Map的方法,可以用ser方法将并行集合传递给串行化的版本。

十九.练习

Scala学习十三——集合的更多相关文章

  1. scala学习笔记-集合

    变长数组:数组缓冲 Scala中对于那种长度会变的数组的数据结构为ArrayBuffer. import scala.collection.mutable.ArrayBuffer; // 一个空的数组 ...

  2. Scala学习笔记--集合类型Queue,Set

    补充知识:http://www.importnew.com/4543.html 正文开始 scala.collection.immutable scala.collection.mutable 队列Q ...

  3. scala 学习笔记--集合

    1.scala集合的null 是nil 而不是null 2.set的三个方法union,intersect,diff union--合并去重 intersect--交集 diff--a减去(a和b交集 ...

  4. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  5. Spark基础-scala学习(五、集合)

    集合 scala的集合体系结构 List LinkedList Set 集合的函数式编程 函数式编程综合案例:统计多个文本内的单词总数 scala的集合体系结构 scala中的集合体系主要包括:Ite ...

  6. Scala 学习之路(五)—— 集合类型综述

    一.集合简介 Scala中拥有多种集合类型,主要分为可变的和不可变的集合两大类: 可变集合: 可以被修改.即可以更改,添加,删除集合中的元素: 不可变集合类:不能被修改.对集合执行更改,添加或删除操作 ...

  7. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

  8. 【大数据】Scala学习笔记

    第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java  以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...

  9. Spark之Scala学习

    1. Scala集合学习: http://blog.csdn.net/lyrebing/article/details/20362227 2. scala实现kmeans算法 http://www.t ...

随机推荐

  1. SpringMVC返回Map类型转换成JSON失败

    错误信息:WARN DefaultHandlerExceptionResolver:380 - Failed to write HTTP message: org.springframework.ht ...

  2. 黑马vue---28、vue中全局过滤器的基本使用

    黑马vue---28.vue中全局过滤器的基本使用 一.总结 一句话总结: vue中的过滤器可以传递参数(根据参数来过滤),也可以用管道符拼接多个过滤器:例如<p>{{ msg | msg ...

  3. 《你不知道的JavaScript(上)》笔记——作用域是什么

    Javascript是一门编译语言,它不是提前编译的, 编译结果也不能在分布式系统中进行移植. 在传统编译语言的流程中, 程序中的一段源代码在执行之前会经历三个步骤, 统称为"编译" ...

  4. 源码编译vi过程中进行配置时报“checking if compile and link flags for Python are sane... no: PYTHON DISABLED”怎么办?

    答: 需要安装python开发库(如果不安装这个库,那么在配置时执行./configure --enable-pythoninterp=yes将不会生效,以至于vi的python特性并没有被开启) 如 ...

  5. Swift 常量

    常量一旦设定,在程序运行时就无法改变其值. 常量可以是任何的数据类型如:整型常量,浮点型常量,字符常量或字符串常量.同样也有枚举类型的常量: 常量类似于变量,区别在于常量的值一旦设定就不能改变,而变量 ...

  6. 07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染

    Flutter实战(交流群:452892873) 本项目是一个实战项目,根据目录建文件,并复制从第一节到最新更新的文章,可以构成完整的一个请求后台数据的项目: CateModel.dart class ...

  7. 解决PLSQL Developer中的乱码问题

    很多朋友在使用PLSQL Developer的时候出现了乱码的问题,我就是其中的一员,后来通过网上的查找以及自己的探索,终于找到了最快,最可靠的解决办法,接下来我将告诉大家如何操作 1.首先在PLSQ ...

  8. 处理HTTP请求

    处理HTTP请求 当客户端浏览器通过URL访问web应用时,首先要做的就是获取用户提交的信息,也就是从HTTP请求数据中获得的信息.HTTP请求数据分为HTTP请求头和Body HTTP请求头包含了一 ...

  9. js匿名函数确实是个好东西

    <body onload="alert('http://www.baidu.com/');"> <script type="text/javascrip ...

  10. shell之判断文件是否存在

    #!/bin/sh myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" #这里的-x 参数 ...