scala快速学习笔记(三):Collections,包
VI.Collections
1.Array
- 一些常用方法:
println,
map( _ * 2),
filter(_ % 2 == 0), sum, reserve
- Array是不可变的,可变的Array使用ArrayBuffer,需要先引入scala.collection.mutable包。例如,预先不知道数组长度可以使用ArrayBuffer来构建数组,构建完毕后,调用它的toArray方法,得到不可变的Array供后续使用,以提高性能。向ArrayBuffer的尾部添加或删除元素的效率很高,但是在别的位置插入元素的效率就比较低下了。 +, ++,
prepend, trimEnd, insert
2.List 在List的头部进行操作,比尾部效率要高,这是因为List是由单链表实现,访问第一个元素只需要O(1)的时间,而最后一个元素则需要O(n)。
和Array的区别:
Arrays allow you to hold a sequence of elements and efficiently access an element at an arbitrary position, both to get or update the element, with a zero-based index.
Lists support fast addition and removal of items to the beginning of the list, but theydo not provide fast access to arbitrary indexes because the implementation must iterate through the list linearly.
1)Nil对象是一个特殊的List对象,其类型是List[Nothing],可用于任何需要List类型实例的场合。
2)构建List:
- apply
::
操作符是List特有的方法,属于右结合操作符,适合于List这样在头部操作效率较高的数据结构。- range方法用于构建一个从开始到结束的一系列数字,包含下边界,但是不包含上边界。
range[Int](1,6,2)
range[Char]('a','c')
- fill方法则用于用一个初始元素创建指定长度的List,该List的每一个元素值都一样。
3)常用操作
- isEmpty: Boolean:判断List是否有元素
- length: Int:获取List的长度
- head: A:取List的第一个元素
- tail: List[A]:获得List除了第一个元素之外,剩下的list
- last: A:获取List的最后一个元素
- init: List[A]:获取除了最后一个元素之外的list
- apply(n): A:获取第n个元素
- drop(n): List[A]:去掉左边n个元素,返回剩下的list,对应的,有dropRight(n)方法
- take(n): List[A]:获取左边n个元素组成的list,也有对应的takeRight(n)方法
- dropWhile(p: A => Boolean): List[A]:去掉左边满足条件的元素
- takeWhile(p: A => Boolean): List[A]:获取左边满足条件的元素
- contains(elem: Any): Boolean:重载SeqLike的方法,判断List是否包含某元素
- exists(p: A => Boolean): Boolean:重载IterableLike的方法,判断List中是否包含满足给定条件的元素
- forall(p: A => Boolean): Boolean:重载IterableLike的方法,判断是否List中所有的元素都满足给定条件
- filter(p: A => Boolean): List[A]:是TraversableOnce特质提供的方法,挑选复合条件的元素组成新的List
- mkString:是TraversableOnce特质提供的方法,有多个重载,可方便的将一个序列转换为String
- splitAt(n: Int): (List[A], List[A]):将List从给定位置分成两个部分,返回一对List。
- :::[B >: A](prefix: List[B]): List[B]:将给定List中的所有元素添加到本List之前。这个方法是右结合运算。
4)List是不可变的,在头部操作效率比较高。如果你需要频繁的更改元素,而且在尾部的操作比较多,可以使用对应的可变集合,ListBuffer。 在ListBuffer上prepend(+=)和append(+=:)操作都是常数时间O(1)。与ArrayBuffer相似,在构建完毕之后,可以使用toList得到不可变的List。
buffer += 2
buffer.+=:(1) // equals to '1 +=: buffer'
3.Set
不同于List和Array,Set分为可变Set和不可变的两个版本。
- 不可变Set位于scala.collection.immutable包里,由于Predef里包含了不可变Set的定义,默认情况下,你使用的Set是不可变Set。
- 要使用可变Set,需要显式引用它所在的包。
- 在需要排序的情况下,可以使用SortedSet或TreeSet,由红黑树实现。(一般Set都是以HashSet实现,也就是底层数据结构是哈希表)
4.Map
Map与Set类似,按可变性,可分为可变Map和不可变Map,按照内部实现,可分为HashMap和TreeMap。
- 构建不可变的Map可使用Map对象的apply方法,该方法接受一系列键值对作为参数。操作符
->
标识一个键值对,(a -> b)等价于(a, b)。
val scores = Map(("Jackie", 90), ("Abby", 93), ("Tim", 87))
val caps = Map("China" -> "Beijing", "France" -> "Paris", "Norway" -> "Oslo")
- 可变map用
scala.collection.mutable.Map,可以通过
toMap
方法返回一个不可变Map。
val teachers = scala.collection.mutable.Map("Chunni" -> "History")
- 访问Map元素直接用apply方法。如果指定的键不存在,会抛出异常。 //Scala中,'[]'一般是用于在泛型中指定类型。而'()'用于方法调用。
- 遍历:
k <- capitals.keySet
(k, v) <- capitals
itr.hasNext //
val itr = capitals.keysIterator
- 需要排序的话,可以使用SortedMap或TreeMap。
5.Tuple
- Tuple是一个方便的集合,可以容纳不同类型的元素,即把一系列对象用小括号'()'括起来。
- Tuple最常用的就是可一次返回多个对象,而且,还可以用一个语句将这多个对象赋值给其他变量。
- Tuple是静态类型的,其类型由编译器通过类型推导(type inference)得知。
- 使用Tuple里的元素,只需用
_i
按位置获取,比如a._1
。 Tuple的位置从1开始,而不是像数组或其他集合那样,从0开始。
VII.
包和引用
- 嵌套的包,可以访问外部的类型,他们在同一范围。但是外部包的类却不能直接访问被嵌套的包里的代码,因为包将内部的代码与外部隔离开来了。
- 绝对路径可能会被误解为相对路径时,可以在路径前加上
_root_
。 - 常常有一些公用的方法和静态值或者枚举等内容,并不严格属于项目的类型系统,在Scala中,包级对象可解决这个问题。以'package object'来定义。包级对象文件名是package.scala。
- 包的引用: import语句可以出现在代码的任何地方,而不仅仅是头部;不但可以引用到类的级别,可以引用包本身;一次引用包内多个成员有两种方式,一种是用通配符'_'引用所有成员,一种是在大括号'{}'内列出需要引用的成员;重命名或隐藏成员,语法是一样的,都是用'[原名称]=>[新名称]'的格式,如果新名称是'_',代表隐藏了原来的类型,而并没有赋予它新的名称,因此该类型将不能使用。
访问修饰符
- Scala中的private限定符,比Java更严格,在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员。Scala中的protected限定符,只严格允许自身和派生类访问。
- 可以给访问修饰符指定作用范围,用中括号标记,比如private[this],protected[a-pacakge]。private[this]与private有细微的差别,private代表的访问范围是类级别,private[this]是对象级别,只能从同一对象内部访问。
scala快速学习笔记(三):Collections,包的更多相关文章
- Scala入门学习笔记三--数组使用
前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...
- scala快速学习笔记(二):控制结构,类和对象
IV.控制结构 1.if/else 除基本用法外,if/else语句能用来赋值,进而代替?:运算符.这得益于在Scala中,每个语句块都有值,就是该语句块最后一个语句的值.请看下面的代码. def a ...
- scala快速学习笔记(一):变量函数,操作符,基本类型
为了用spark,先学下scala. 参考教程:http://meetfp.com/zh/scala-basic doc查询:http://docs.scala-lang.org 其它资料:http: ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Knockout.js快速学习笔记
原创纯手写快速学习笔记(对官方文档的二手理解),更推荐有时间的话读官方文档 框架简介(Knockout版本:3.4.1 ) Knockout(以下简称KO)是一个MVVM(Model-View-Vie ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
- Angular快速学习笔记(2) -- 架构
0. angular 与angular js angular 1.0 google改名为Angular js 新版本的,2.0以上的,继续叫angular,但是除了名字还叫angular,已经是一个全 ...
随机推荐
- linux下连接到远程主机,用图像界面(想在远程服务器上用cmake)
1. 需要通过SSH -X username@ip登陆服务器后,再用图形界面,比如用cmake 2.直接用 SSH username@ip命令登陆服务器后,不能用cmake
- 九度oj 题目1491:求1和2的个数
题目描述: 给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,10序列中1和2的个数之和为3,因此F(10)=3.输入N,求F(N)的值,1 ...
- [luoguP2221] [HAOI2012]高速公路(线段树)
传送门 考虑每一段对答案的贡献 用每一段的左端点来表示当前这一段,那么区间就变成了[1,n-1] 如果询问区间[l,r],其中一个点的位置为x,则它对答案的贡献为(x-l)*(r-x)*s[x](s[ ...
- 常州模拟赛d2t2 小X的密室
题目描述 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 单向地 创造一条从房间 X 到房间 Y 的通道.另 ...
- 洛谷 [P2485] 计算器
快速幂+同余方程+BSGS 同余方程在解的时候要注意,在将exgcd求出的解变换为原方程的解的时候,要取模 BSGS的原理就是用分块+hash优化暴力,要注意特判 a 和 b 是 p 的倍数的时候. ...
- C++ 中new
operator new在C++中的各种写法 (2011-09-21 14:59:33) 标签: 杂谈 乍一看,在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单.然而,这 ...
- 在 Windows 下用 TDM-GCC(MinGW)开发 DLL 涉及到数据同步锁及 DLL 初始化终止化函数的问题
在 Windows 下用 TDM-GCC(MinGW)开发 DLL 如果要用到数据同步锁,理论上可以采用 Windows API 提供的临界区实现(需要用到的函数有 InitializeCritica ...
- hdu 4882 /按排顺序使序列最优问题
题意: 安排一个序列,该序列每个数有俩个属性:t[i].val[i].计算一个点的价值:到目前为止的总时间*val[i].,,求 安排顺序后使得 计算所有点的价值之和最小. 思路:对于任意相邻俩项, ...
- Oracle 实现 一个关键字 匹配多个 字段
有这么一个需求,满足只有一个输入框的条件下,支持不同数据列的搜索结果. 说白了,就是这个 输入框 既可以用来 搜索姓名,也可以搜索 年龄,地址等. 分析: 一般情况下,我们的一个输入框对应 数据库 ...
- HDOJ 5213
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5213 BC 上的题,题解很清楚,会莫对的应该不难, 对于一个询问,我们拆成四个询问,开始拆成求区间矩形 ...