scala编程第17章学习笔记(1)——集合类型
列表
列表的初始化及对其首尾的访问:
scala> val colors = List("red", "blue", "green")
colors: List[String] = List(red, blue, green) scala> colors.head
res15: String = red scala> colors.tail
res16: List[String] = List(blue, green)
数组
创建长度已知但内容未知的数组:
scala> val fiveInts = new Array[Int](5)
fiveInts: Array[Int] = Array(0, 0, 0, 0, 0)
根据已知元素初始化数组:
scala> val fiveToOne = Array(5, 4, 3, 2, 1)
fiveToOne: Array[Int] = Array(5, 4, 3, 2, 1)
访问和更新数组元素:
scala> fiveInts(0) = fiveToOne(4) scala> fiveInts
res18: Array[Int] = Array(1, 0, 0, 0, 0)
列表缓存
ListBuffer是可变对象(包含在scala.collection.mutable包中),它可以更高效地通过添加元素的方式构建列表。ListBuffer能够支持常量时间的添加和前缀操作。元素的添加使用+=操作符,前缀使用+:操作符。完成之后,可以通过ListBuffer调用toList方法获得List。举例如下:
scala> val buf = new ListBuffer[Int]
buf: scala.collection.mutable.ListBuffer[Int] = ListBuffer() scala> buf += 1
res20: buf.type = ListBuffer(1) scala> buf += 2
res21: buf.type = ListBuffer(1, 2) scala> buf
res22: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2) scala> 3 +: buf
res23: scala.collection.mutable.ListBuffer[Int] = ListBuffer(3, 1, 2) scala> buf.toList
res24: List[Int] = List(1, 2)
数组缓存
ArrayBuffer与数组类似,只是额外还允许你在序列的开始或结束的地方添加和删除元素。所有的Array操作都被保留,只是由于实现中的包装层导致执行的稍微有些慢。
创建ArrayBuffer的时候,你必须指定它的类型参数,但可以不指定长度。ArrayBuffer可以自动调整分配的空间:
ArrayBuffer还能用+=操作添加元素:
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer scala> val buf = new ArrayBuffer[Int]()
buf: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() scala> buf += 12
res27: buf.type = ArrayBuffer(12) scala> buf += 15
res29: buf.type = ArrayBuffer(12, 15)
所有数组能使用的方法数组缓存都能用。如可以获得ArrayBuffer的长度,或通过索引访问元素:
scala> buf.length
res30: Int = 2 scala> buf(0)
res31: Int = 12
队列
Scala的集合库提供了可变和不可变的Queue。以下方法创建空的不可变队列:
scala> import scala.collection.immutable.Queue
import scala.collection.immutable.Queue scala> val empty = Queue[Int]()
empty: scala.collection.immutable.Queue[Int] = Queue()
可以使用enqueue为不可变队列添加元素:
scala> val has1 = empty.enqueue(1)
has1: scala.collection.immutable.Queue[Int] = Queue(1)
如果要添加多个元素的话,可以把集合当作enqueue调用的参数:
scala> val has123 = has1.enqueue(List(2, 3))
has123: scala.collection.immutable.Queue[Int] = Queue(1, 2, 3)
从队列的头部移除元素,可以使用dequeue:
scala> val (element, has23) = has123.dequeue
element: Int = 1
has23: scala.collection.immutable.Queue[Int] = Queue(2, 3)
对于不可变队列来说,dequeue方法将返回由队列头部元素和移除该元素之后的剩余队列组成的对偶(Tuple2)。
可变队列的使用方式与不可变队列一样,只是代之以enqueue方法,可以使用+=及++=操作符添加元素。还有,对于可变队列来说,dequeue方法将只从队列移除头元素并返回。举例如下:
scala> import scala.collection.mutable.Queue
import scala.collection.mutable.Queue scala> val queue = Queue[String]()
queue: scala.collection.mutable.Queue[String] = Queue() scala> queue += "a"
res0: queue.type = Queue(a) scala> queue ++= List("b", "c")
res1: queue.type = Queue(a, b, c) scala> queue
res2: scala.collection.mutable.Queue[String] = Queue(a, b, c) scala> queue.dequeue
res3: String = a scala> queue
res4: scala.collection.mutable.Queue[String] = Queue(b, c)
栈
Stack同样在Scala的集合库中有可变和不可变两个版本。元素的推入使用push,弹出使用pop,只获取栈顶的元素而不移除可以使用top。下面是使用可变栈的例子:
scala> import scala.collection.mutable.Stack
import scala.collection.mutable.Stack scala> val stack = new Stack[Int]
stack: scala.collection.mutable.Stack[Int] = Stack() scala> stack.push(1)
res5: stack.type = Stack(1) scala> stack
res6: scala.collection.mutable.Stack[Int] = Stack(1) scala> stack.push(2)
res7: stack.type = Stack(2, 1) scala> stack
res8: scala.collection.mutable.Stack[Int] = Stack(2, 1) scala> stack.top
res9: Int = 2 scala> stack
res10: scala.collection.mutable.Stack[Int] = Stack(2, 1) scala> stack.pop
res11: Int = 2 scala> stack
res12: scala.collection.mutable.Stack[Int] = Stack(1)
字符串(经RichString隐式转换)
RichString也是应该知道的序列,它的类型是Seq[Char]。因为Predef包含了从String到RichString的隐式转换,所以你可以把任何字符串当作Seq[Char]。举例如下:
scala> def hasUpperCase(s:String) = s.exists(_.isUpper)
hasUpperCase: (s: String)Boolean scala> hasUpperCase("Robert Frost")
res13: Boolean = true scala> hasUpperCase("e e cummings")
res14: Boolean = false
scala编程第17章学习笔记(1)——集合类型的更多相关文章
- scala编程第17章学习笔记(3)
可变(mutable)集合与不可变(immutable)集合 为了更易于完成不可变集合到可变集合的转换,或者反向转换,Scala提供了一些语法糖.纵使不可变集和映射并不支持真正的+=方法,Scala还 ...
- scala编程第17章学习笔记(4)——元组
元组可以把固定数量的条目组合在一起以便于作为整体传送.不像数组或列表,元组可以保存不同类型的对象. 元组常用来返回方法的多个值.例如,下面的方法找到集合中的最长单词并返回它的索引: scala> ...
- scala编程第17章学习笔记(2)——集和映射
默认情况下在使用“Set”或“Map”的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版本的集合或映射,方法之一是引用包含了可变 ...
- scala编程第16章学习笔记(3)——List类的高阶方法
列表间映射:map.flatMap和foreach 1.xs map f 操作返回把函数f应用在xs的每个列表元素之后由此组成的新列表.如: scala> List(1, 2, 3) map ( ...
- scala编程第16章学习笔记(2)
转换列表:toIterator, toArray,copyToArray List类的toArray方法将递归存放的列表转换为连续存放的数组 Array类的toList方法将连续存放的数组转换为递归存 ...
- scala编程第16章学习笔记(1)
List列表的基本操作 head方法获得列表的第一个元素 tail方法获得列表除第一个元素之外的其它元素 isEmpty:判断列表是否为空,空的话返回真 last:获得列表最后一个元素 init:获得 ...
- scala编程第19章学习笔记(1)——类型参数化
一.queues函数式队列 函数式队列是一种具有以下三种操作方式的数据结构: head 返回队列的第一个元素. tail 返回除第一个元素之外的队列. scala> import scala.c ...
- scala编程第18章学习笔记——有状态的对象
银行账号的简化实现: scala> class BankAccount{ | private var bal: Int = 0 | def balance: Int = bal | def de ...
- scala编程第16章学习笔记(4)——List对象的方法
通过元素创建列表:List.apply List(1, 2, 3) 等价于List.apply(1, 2, 3): scala> List.apply(1, 2, 3) res0: List[I ...
随机推荐
- http://localhost/ 或 http://127.0.0.1/ 报错:HTTP 404 的解决办法
一些初次接触使用 Eclipse 工具来开发 JAVA Web 工程的开发人员,可能会对 Eclipse 和 Tomcat 的绑定产生一个疑惑. 那就是 在修改了 Tomcat 的8080端口为80后 ...
- shuffle过程分析
shuffle的过程分析 shuffle阶段其实就是之前<MapReduce的原理及执行过程>中的步骤2.1.多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点 ...
- kylin加载hive表错误:ERROR [http-bio-7070-exec-10] controller.TableController:189 : org/apache/hadoop/hive/conf/HiveConf java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf 解决办法
一.问题背景 在kylin中加载hive表时,弹出提示框,内容是“oops!org/apache/hadoop/hive/conf/HiveConf”,无法加载hive表,查找kylin的日志时发现, ...
- 2017-2018-1 20179202《Linux内核原理与分析》第七周作业
一 .Linux内核创建一个新进程的过程 1. 知识准备 操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理 linux 进程的状态和操作系统原理的描述进程状态有所不同,比如就绪状 ...
- Revit二次开发示例:DeleteDimensions
在本例中,创建一个命令,实现删除所选中的尺寸标注. #region Namespaces using System; using System.Collections.Generic; using S ...
- Power OJ 2605 SPFA+dp思想
题目链接[https://www.oj.swust.edu.cn/problem/show/2605] 题意:给出包含N(N <= 5000)个点M条边的有向图,然后求1 - N在满足距离小于T ...
- 手机html根据手机分辨率网页文字大小自适应
问题:不同手机型号屏幕尺寸大不相同,导致同样的文字,有的显示一行,有的显示多行. 通过查资料和自己的尝试解决:网页开发习惯的px单位,手机html开发不适用. 源代码如下: <!DOCTYPE ...
- Codeforces Round #360 (Div. 2) B. Lovely Palindromes 水题
B. Lovely Palindromes 题目连接: http://www.codeforces.com/contest/688/problem/B Description Pari has a f ...
- codevs 1204 寻找子串位置 KMP
1204:寻找子串位置 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 18K Solved: 8K Description 给出字符串a和字符串b,保 ...
- Codeforces Round #288 (Div. 2) C. Anya and Ghosts 模拟 贪心
C. Anya and Ghosts time limit per test 2 seconds memory limit per test 256 megabytes input standard ...