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) <- capitalsitr.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,已经是一个全 ...
随机推荐
- 全库修改SQL Server现有排序规则
近日,在项目Debug过程中发现了SQL Server排序规则冲突的问题. 由于原数据库是从英文环境的SQL中生成的,其排序规则为“SQL_Latin1_General_CP1_CI_AS”,备份到本 ...
- 【bzoj2901】矩阵求和 前缀和
题目描述 给出两个n*n的矩阵,m次询问它们的积中给定子矩阵的数值和. 输入 第一行两个正整数n,m. 接下来n行,每行n个非负整数,表示第一个矩阵. 接下来n行,每行n个非负整数,表示第二个矩阵. ...
- BZOJ 4318 OSU! ——期望DP
这次要求$x^3$的概率和. 直接维护三个值$x$ $x^2$ $x^3$的期望. 概率的平方不等于平方的概率. #include <map> #include <ctime> ...
- Pizza Delivery
Pizza Delivery 时间限制: 2 Sec 内存限制: 128 MB 题目描述 Alyssa is a college student, living in New Tsukuba Cit ...
- android开发里遇到的坑——eclipse项目导入android studio以后Run按钮灰色
android studio编译有错误但是没有提示给用户,关闭android studio重新启动项目后,会显示错误,修复以后即可!
- 洛谷P2625 豪华游轮
题目描述 有一条豪华游轮(其实就是条小木船),这种船可以执行4种指令: right X : 其中X是一个1到719的整数,这个命令使得船顺时针转动X度. left X : 其中X是一个1到719的整数 ...
- .net面试题汇总-第二篇
本篇主要关注下,.net面试题中经常用的算法问题 1.有一群猴子,它们每天要吃桃子,它们第一天吃的数量是总量的一半再多一个,第二天吃的是第一天剩下的一半再多一个,第三天吃的是第二天剩下的一半多一个,以 ...
- Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第104篇原创 文章工程:* JDK 1.8* M ...
- vue之条件渲染
一.v-if v-if指令用于条件的渲染一块内容,当指令的表达式返回true时,内容才会被渲染. <h1 v-if="isshow">要显示么</h1> d ...
- Codeforces #471
C(分段) 题意: 分析: 我们分别考虑p=2和p>=3的情况 当p=2的时候,个数明显是[L,R]内完全平方数的个数 当p>=3的时候,我们注意到这样的数字个数是1e6级别的,且a最多也 ...