跟连乐一起学Scala-集合

欢迎加入Scala讨论QQ群212859367,和连乐一起讨论学习!

集合



主要的集合特质

Seq 是一 个有先后次序的值的序列。比如数组和列表。IndexedSeq允许我们通过整型的下标快速的访问任意元素。

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

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



序列

Vector是ArrayBuffer的不可变版本:一个带下标的序列,支持快速的随机访问。

向量是以树形结构的形式实现的,每个节点可以有不超过32个子节点。



列表

Scala中,列表要么是Nil(空列表),要么是一个head元素加上一个tial,而tail又是一个列表。

val digits = List(4, 2)


可变列表

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

val lst = scala.collection.LinkedList(1, -2, 7, -9)
//如下循环会将所有的负数都改为0
var cur = lst
while(cur != Nil) {
    if (cur.elem < 0) cur.elem = 0
    cur = cur.next
}

//如下循环会去除每两个元素中的一个
var cur = lst
while (cur != Nil && cur.next != Nil) {
    cur.next = cur.next.next
    cur = cur.next
}


集是不可重复元素的集合。

集是以哈希集实现的。

已排序的集,可以使用链式哈希集。(使用红黑树实现)



常用方法

(详见《快学Scala》P175-P177)



将函数映射到集合

val names = List("Peter", "Paul", "Mary")
names.map(_.toUpperCase)  //List("PETER", "PAUL", "MARY")

def ulcase(s: string) = Vectior(s.toUpperCase(), s.toLowerCase())

//那么:
names.map(ulcase)  //得到:List(Vector("PETER", "peter"), Vector("PAUL", "paul"), Vector("MARY", "mary"))


拉链操作

zip:将相互对应的两个集合的元素结合起来

val prices = List(5.0, 10.0, 3.0)
val quantities = List(10, 2, 1)

prices zip quantities
//将得到:
List[(Double, Int)] = List((5.0, 10), (10.0, 2), (3.0, 1))

(prices zip quantities) map {p => p._1 * p._2}

//得到List(50.0, 20.0, 10)


迭代器

使用iterator方法从集合获得一个迭代器。



def numsFrom(n: BigInt): Stream[BigInt] = n #:: numsFrom(n + 1)  //#::构造的是一个流


懒视图

使用view方法来懒加载。



与Java集合的相互操作

详见《快学Scala》P187



线程安全的集合

SynchronizedBuffer

SynchronizedMap

SynchronizedPriorityQueue

SynchronizedQueue

SynchronizedSet

SynchronizedStack



并行集合

如果coll是一个大型集合,那么使用:

coll.par.sum 计算,就会并发计算和。

欢迎加入Scala讨论QQ群212859367,和连乐一起讨论学习!

时间: 2024-10-14 13:53:59

跟连乐一起学Scala-集合的相关文章

快学Scala第13章----集合

本章要点 所有集合都扩展自Iterable特质 集合有三大类:序列.集.映射 对于几乎所有集合类,Scala都同时提供了可变的和不可变的版本 Scala列表要么是空的,要么拥有一头一尾,其中尾部本身又是一个列表 集是无先后次序的集合 用LinkedhashSet 来保留插入顺序,或者用SortedSet来按顺序进行迭代 '+' 将元素添加到无先后次序的集合中: +: 和 :+ 向前或向后追加到序列: ++将两个集合串接在一起: -和–移除元素 Iterable和Seq特质有数十个用于常见操作的方

从零学scala(七)集合、模式匹配和样例类

一:集合 主要的集合特质 scala集合中重要的特质: Trait(Iterable) Trait(Seq) Trait(Set) Trait(Map) Trait(IndexedSeq) Trait(SoredSet) Trait(SoredMap) Seq是一个有先后次序的值的序列,比如数组和列表.IndexSeq允许我们通过下表快速访问元素,ArrayBuffer是带下标的,但是链表不是. Set是一个没有先后次序的值的序列,SortedSet中,元素以排过序的顺序被访问. Map是一组(

快学scala笔记.

第一章 基础 val 定义的值实际上是一个常量 var 声明其值可变的变量 val xmax,ymax = 100 var greeting,message: String = null 1.3 常用类型 Scala的7种数值类型:Byte.Char.Short.Int.Long.Float和Double 1.toString() 2.to(10) "Hello".intersect("World") 1.4 算术和操作符重载 val answer = 8 * 5

快学Scala 第十九课 (trait的abstract override使用)

trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super.log依旧是个abstract class,所以必须在方法前加上abstract和override.但是并没有具体介绍如何使用,然后查阅了其他文档,才明白使用方法. 下面的代码定义了超类LoggerEmpty,这个定义意味着该特质只能混入扩展LoggerEmpty的类中. 在特质中声明抽象方法中有

快学Scala课后习题答案

分享一个之前做快学Scala的课后习题(2-21章节,19无)的Github链接,我把习题的文字写在了每个回答的注释上面,这样方便大家对照着看,省的回过头去对照着pdf看了,如果有做的不对的地方希望大家给予指正. 链接如下,http://github.com/fxxkinglife/scala-hello. 举一个第二章节的例子, object charpter02 { /* * 2.1 * 一个数字如果为正数,则它的signum为1; * 如果是负数,则signum为-1; * 如果为0,则s

快学scala 第十一章 操作符 读书笔记及习题答案代码

chapter 11 操作符 标签:快学scala 一.笔记 scala种可以在反引号中包含几乎任何字符序列, val 'val' = 42 所有的操作符都是左结合的,除了以冒号(:)结尾的操作符,和赋值操作符.用于构造列表的::操作符是又结合的.1::2::Ni1的意思是1::(2::Ni1),先创建出包含2的列表,这个列表又被作为尾巴拼接到以1作为头部的列表中. 2. 函数调用语法:f(arg1, arg2,...)扩展到可以应用于函数之外的值,如果f不是函数或方法,那么这个表达式等于f.a

[Scala] 快学Scala A2L2

集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快速访问任意元素.但是链表不可以. Set是一组没有先后次序的值.SortedSet中,元素排过序. Map时一组(键,值)对.SortedMap按键排序 每一个Scala集合特质或类都有一个带有apply 方法的伴生对象. 13.2 可变和不可变集合 13.3 序列Sequence 不可变序列:In

scala集合类型与java的转换

scala集合与java集合类型相互转换: http://www.scala-lang.org/api/current/index.html#scala.collection.JavaConverters$ 您可以通过JavaConverters package轻松地在Java和Scala的集合类型之间转换.它用asScala 装饰常用的Java集合以和用asJava 方法装饰Scala集合.    import scala.collection.JavaConverters._    val 

快学Scala习题解答—第一章 基础

1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on the Java Virtual Machine>好很多. 是本不错的入门书.而且每个章节都设置了难度级别,每章有习题,可以巩固Scala语法. 本文的目的就是针对这些习题进行解答 2 基础 2.1 在Scala REPL中键入3,然后按Tab键.有哪些方法可以被应用? 这个....直接操作一遍就有结果了.