scala中的常用集合

本文主要记录了scala学习中的一些常用集合,主要包括序列Seq;值的集合Set;键值对构成的对偶的映射Map。

概述

Scala提供了一系列的集合类的实现。
Scala中所有的集合都扩展了Iterable特质。集合又可以分为三类:有先后次序的序列Seq;值的集合Set;键值对构成的对偶的映射Map。
三类集合下分别还实现了特殊访问方式的特质:可以由下标来进行随机访问的IndexedSeq;可按照顺序访问的SortedSet;可按顺序访问的SortedMap。

package scala.collection

这里写图片描述

package scala.collection.immutable

这里写图片描述

package scala.collection.mutable

这里写图片描述

基本集合

List

List是scala中最常用的集合之一

scala> val ls = List(1,2,3,4,5)
ls: List[Int] = List(1, 2, 3, 4, 5)

List可以使用 ::: 进行连接,也可以使用 e :: ls 进行添加元素,同样也可以使用head 和 tail获取头元素和去掉头元素的剩下的List

scala> ls.tail
res0: List[Int] = List(2, 3, 4, 5)

scala> ls.head
res1: Int = 1

scala> 0::ls
res2: List[Int] = List(0, 1, 2, 3, 4, 5)

scala> ls ::: List(6,7,8)
res3: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8)

Set

Set和List的区别是,Set里面不能包含重复元素。

scala> Set(1,1,2,2,3,4,4)
res4: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

scala> Set(1,2,3) ++ Set(3,4,5)
res7: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)

Seq

Seq有一定的顺序,Seq是一个trait,List是它的一个实现类。

scala> Seq(1,3,4,2,5)
res8: Seq[Int] = List(1, 3, 4, 2, 5)

Tuple

Tuple(元组)可以直接把一组数据组合在一起

scala> val t = ("name",1,1000L)
t: (String, Int, Long) = (name,1,1000)

scala> t._1
res10: String = name

Map

Map可以以键值对的形式存储数据

scala> val map = Map(1->"a", 2->"b")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)

scala> map(2)
res11: String = b

Option

Option 便是包含或者不包含。
Option本身是泛型的,它有两个子类:Some[T]和None

scala> val map = Map(1->"a", 2->"b")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)

scala> map.get(2)
res12: Option[String] = Some(b)

scala> map.get(3)
res13: Option[String] = None

Option类型,首先要判断是否是 isDefined 的,是的话可以用 get 来获取值

val result = if (a.isDefined) {
  a.get
} else {
  0
}

或者直接用getOrElse方法

scala> Option(3).getOrElse(0)
res14: Int = 3

scala> None.getOrElse(0)
res15: Int = 0

常用集合子类

HashMap

支持快速查找的最常用的集合类,HashMap分为变长和定长两种,定长的创建后不能添加元素

scala> val hm = collection.mutable.HashMap(1->"a",2->"b")
hm: scala.collection.mutable.HashMap[Int,String] = Map(2 -> b, 1 -> a)

scala> hm.put(3,"c")
res16: Option[String] = None

scala> hm
res17: scala.collection.mutable.HashMap[Int,String] = Map(2 -> b, 1 -> a, 3 -> c)

Vector

Vector支持快速查找,是为了提高list的随机存取效率而引入的新集合类型,list存取前部的元素快,越往后越慢。

scala> val vc = IndexedSeq(1,2,3,3)
vc: IndexedSeq[Int] = Vector(1, 2, 3, 3)

Seq的缺省实现是List, IndexSeq的缺省实现是Vector.

Range

有序的Int序列, 支持标准的函数组合器。有关函数组合器的内容请参阅另一篇文章

scala> Range(1,6)
res21: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5)

等同于 0 to 4

Stack

堆栈,先进后出

scala> val s = collection.mutable.Stack[Int]()
s: scala.collection.mutable.Stack[Int] = Stack()

scala> s.push(1)
res23: s.type = Stack(1)

scala> s.pop
res24: Int = 1

Queue

先进先出的队列

scala> val mq = collection.mutable.Queue[Int]()
mq: scala.collection.mutable.Queue[Int] = Queue()

scala> mq +=(1,2,3)
res25: mq.type = Queue(1, 2, 3)

scala> mq ++= List(4,6,5)
res26: mq.type = Queue(1, 2, 3, 4, 6, 5)

scala> mq.dequeue
dequeue   dequeueAll   dequeueFirst

scala> mq.dequeue
res27: Int = 1

scala> mq
res28: scala.collection.mutable.Queue[Int] = Queue(2, 3, 4, 6, 5)

Stream

Stream相当于lazy List,避免在中间过程中生成不必要的集合。List是先把数据构造出来,然后在一堆数据中挑选需要的数据,
而Stream是先把算法构造出来,挑选算法,最后只执行一大堆算法中我们需要的那一部分。

比如 我们查找0到1000000 中 所有能整除15的数,你首先需要一个一个地处理这些数,看是否能整除15,
然后来构建这个过滤了的列表。使用Stream只会进行必要的处理来查找,而不是对所有的数同时进行计算。

这样Scala就可以允许你毫无顾忌地创建一个开销很大的列表;运行时环境会一个一个地对Stream中的元素进行求值,直到
指定的条件达到——并且后面的元素不会被求值。一句话,就是stream会比list节省大量内存。

scala> Range(0,1000000000).filter(_ % 15 ==0).size
java.lang.OutOfMemoryError: GC overhead limit exceeded
  at java.lang.Integer.valueOf(Integer.java:832)
  at scala.runtime.BoxesRunTime.boxToInteger(BoxesRunTime.java:69)
  at scala.collection.immutable.Range.foreach(Range.scala:166)
  at scala.collection.TraversableLike$class.filterImpl(TraversableLike.scala
  at scala.collection.TraversableLike$class.filter(TraversableLike.scala:270
  at scala.collection.AbstractTraversable.filter(Traversable.scala:104)
  ... 26 elided


scala>  Range(0,1000000000).toStream.filter(_ % 15 ==0).size
res0: Int = 66666667

使用List直接进行操作的话内存溢出,而用stream会很容易计算出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值