《快学Scala》——数组、映射和元组

数组
定长数组:在Scala中可以用Array,初始化一个定长数组。例如:
val nums = new Array[Int](10) //10个整数的数组,所有元素初始化为0 val a = new Array[String](10) //10个元素的字符串数组,所有元素初始化为null val s = Array("Hello", "Scala") //长度为2的字符串数组 s(0) = "Hi" //使用()来访问数组中的元素,使得s变成Array("Hi","Scala")
注:已提供初始值就不需要使用new。
在JVM中,Scala的Array以Java数组方式实现,如字符串数组对应java.lang.String[],Int、Double等基本数据类型对应Java中都是基本数据类型数组,如Array(2,3,4)在JVM中就是一个int[]。变长数组(数组缓冲):Scala中使用
ArrayBuffer来实现。使用前需要引入包import scala.collection.mutable.ArrayBuffer。
1.用+=在尾部添加元素。
2.用+=在尾部添加多个元素,用括号包起来。
3.用++=追加任何元素。
4.移除尾部的三个元素。

insert可以在任意位置插入元素。remove可以在任意位置删除元素。缺点是:这样做需要移动后面的元素。
变长数组可以和定长数组之间相互转换,通过使用toArray和toBuffer。转换:在Scala中,可以用某种方式对一个数组(或数组缓存)进行转换,这种操作不会修改原数组,而是产生新的数组。如下:

for(...) yield循环创建了一个类型与原始集合相同的集合。遍历:使用for循环遍历数组或数组缓冲。如下:
for (i <- 0 until a.length) println(i + ": " + a(i))until:返回所有小于上限的数字。
也可以使用如下方法:for (elem <- a) println(elem)多维数组:Scala中多维数组是通过数组的数组实现的。如:
Array[Array[Int]],也可以使用ofDim方法。如下:

第一个是生成10行的二维数组,但列数不确定。
第二个是生成3*4的二维数组。
在Scala API文档中还有许多关于数组的函数,比如sum、max、min等。这里介绍一个mkString和toString。
当需要显示数组或者数组缓冲就可以使用mkString方法,这个方法还可以指定元素之间的分割符。如下:

而对于toString方法,Array只会生成没意义的地址码。ArrayBuffer会被完全转化成String。如下:

映射
构造映射:
构造不可变映射Map[String,Int],其中的值不能被改变:val scores1 = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) val scores2 = Map(("Alice", 10), ("Bob", 3), ("Cindy", 8))构造可变映射:
val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)构建一个空映射:
val scores = scala.collection.mutable.HashMap[String, Int]在Scala中映射是 对偶 的集合,就是用两个值构成一个组。
获取映射值:
使用()来获取某个键对应的值。如:val bobscore = scores("Bob")若映射中不包含这个键,将会抛出异常。Scala中可以使用
contains方法判断映射中是否包含某个键。为了防止抛出异常也可以这么做:val bobscore = scores.getOrElse("Bob", 0) //如果没有Bob这个键就返回0更新映射值:
在可变映射中可以更新映射的值或者添加新的映射关系,做法是在=的左侧使用(),如下:scores("Bob") = 10 //更新Bob的值 scores("xiaoming") = 5 //添加新的键值对也可以使用
+=来增加多个键值对(如果有相同的键则更新对应的值),用-=来移除某个键值对。如下:

对于不可变映射,可以使用如下方法对映射进行更新和删除,更新后会生成一个新映射。val newScores = scores + ("Bob" -> 10, "Freb" -> 7) //更新 val newScores = scores - ("Bob" -> 10) //删除迭代:
for((k, v) <- 映射) 处理k和v如果只需要访问键或值,则可以用
keySet和values方法。values方法返回一个Iterable,这样就可以在for循环中使用这个'Iterable'。如下:scores.keySet //生成一个类似Set("Bob","Cindy","Fred")这样的集合 for(v <- scores.values) println(v) //将打印value值
元组
映射是键值对偶的集合,对偶是元组(tuple)的最简单的形态。元组是不同类型的值的聚集。元组的值是通过将单个的值包括在圆括号中构成。元组的初始化、读取元素和模式匹配的操作如下:

注:其中t._2用来读取元组中的第二个元素。(f,s,_)中的_表示这个位置的元素不需要。
《快学Scala》——数组、映射和元组的更多相关文章
- 快学Scala习题解答—第一章 基础
1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on th ...
- 《快学Scala》
Robert Peng's Blog - https://mr-dai.github.io/ <快学Scala>Intro与第1章 - https://mr-dai.github.io/S ...
- 快学Scala 第十九课 (trait的abstract override使用)
trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...
- 快学Scala习题解答—第四章 映射和元组
4 映射和元组 4.1 设置一个映射,当中包括你想要的一些装备,以及它们的价格.然后构建还有一个映射.採用同一组键,可是价格上打9折 映射的简单操作 ,"gun"->18 ...
- [Scala] 快学Scala A1L1
基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...
- Scala的映射和元组操作
映射和元组操作 构造Map // 构造一个不可变的MAP映射,类似与key -> value这样的组合叫做对偶 val score = Map("Jack" -> 12 ...
- 《快学Scala》第四章 映射与元组
- 快学Scala习题解答—第三章 数组相关操作
3 数组相关操作 3.1 编写一段代码.将a设置为一个n个随机整数的数组,要求随机数介于0(包括)和n(不包括)之间 random和yield的使用 import scala.math.rando ...
- 快学Scala 第五课 (构造映射,获取映射值,更新映射值,迭代映射,与Java互操作)
构造映射: val score = Map[String, Int]() val score1 = HashMap[String, Int]() val value1 = Map[String, In ...
随机推荐
- CSS中清除浮动的方法
CSS浮动,最早是为了达到文字环绕的效果提出的,也可以用来做布局,但是布局会产生很多问题(高度塌陷,漂浮在普通流上),会使当前标签产生上浮的效果,会影响前后标签,同样的代码在不同的浏览器的兼容性也不一 ...
- java学习笔记 --- 多态
一.多态 (1)定义:同一个对象在不同时刻体现出来的不同状态.父类的引用或者接口的引用指向了自己的子类对象. Dog d = new Dog();//Dog对象的类型是Dog类型. Animal ...
- benchmark 库
性能测试的库 https://github.com/bestiejs/benchmark.js
- Azure Messaging-ServiceBus Messaging消息队列技术系列7-消息事务
上篇博文中我们介绍了Azure Messaging-ServiceBus Messaging消息回执机制. Azure Messaging-ServiceBus Messaging消息回执机制 本文中 ...
- 高并发场景之RabbitMQ篇
上次我们介绍了在单机.集群下高并发场景可以选择的一些方案,传送门:高并发场景之一般解决方案 但是也发现了一些问题,比如集群下使用ConcurrentQueue或加锁都不能解决问题,后来采用Redis队 ...
- 老李分享:loadrunner用javavuser进行接口测试
老李分享:loadrunner用javavuser进行接口测试 在这里分享一个poptest培训过程中案例,在日常工作中会遇到被测试系统通讯都是通过加密的数据包,加密算法是公司自己开发的,并且发送的数 ...
- 老李分享:adb发送的指令都有哪些
老李分享:adb发送的指令都有哪些 这两天在poptest上课的时候,我们邀请了业内技术牛人为我们的学员讲解手机自动化方面的知识,每天大家都很踊跃,要学习到晚上11点多才能,有的学员跟我说都累傻了 ...
- java中的==、equals()、hashCode()源码分析
转载自:http://www.cnblogs.com/xudong-bupt/p/3960177.html 在Java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际 ...
- 使用WebView监控网页加载状况,PerformanceMonitor,WebViewClient生命周期
原理:WebView加载Url完成后,注入js脚本,脚本代码使用W3C的PerformanceTimingAPI, 往js脚本传入一个Android对象(代码中为AndroidObject),在js脚 ...
- Node.js系列:Buffer类的使用
客户端JavaScript中没有对二进制数据提供很好的支持.但是在处理TCP流或文件流时,必须要处理二进制数据.Node.js定义了一个Buffer类,用来创建一个专门存放二进制数据的缓存区. Buf ...