码迷,mamicode.com
首页 > 其他好文 > 详细

跟连乐一起学Scala-集合

时间:2015-06-19 10:40:06      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

欢迎加入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,和连乐一起讨论学习!

跟连乐一起学Scala-集合

标签:

原文地址:http://blog.csdn.net/anglebluesnow/article/details/46553397

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!