欢迎加入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