Scala学习(四)映射和元组

1.构造映射

映射其实就是Map,Scala中映射分为可变映射和不可变映射。java

不可变映射其值不能改变,构造方式以下:数组

从上面咱们能够看到,当咱们尝试去改变不可变映射的值时,报错了。而且这里注意看下咱们的Map是 scala.collection.immutable.Map[String,Int] 注意immutable包,他表示不可变,这里能够与后续的可变映射的包名做对比函数

若是你须要构造一个可变映射,请这样作:使用 scala.collection.mutable.Mapspa

若是你想从一个空的映射开始,你须要选定一个映射实现并给出类型参数:scala

在Scala中映射是对偶的集合。对偶简单地说就是两个值构成的组,这两个值并不必定是同一个类型,好比("HYC",10)。对象

-> 操做符用来建立对偶  "HYC" -> 10 产出的代码是("HYC",10),所以我么你彻底能够这样来定义映射:排序

2.获取映射中的值

获取值得方法前面咱们已经使用了ip

咱们使用()来获取值,和数组很像,可是数组()当中是坐标,映射当中()是key。io

--------------------------------------table

要检查映射中是否有某个指定的键,能够用contains方法

因为这样的组合十分广泛,所以Scala中提供了一个快捷方法:

3.更新映射中的值

更新映射中的值,相似于赋值的操做,map变量是一个可变映射

针对已经有的值,会采用覆盖更新操做。

针对没有的值,会从新生成一个映射

若是咱们想要在映射中添加多个关系,能够用+=操做:

对应的,移除某个键对应的值,能够用-=操做:

--------------------------------------

你不可能更新一个不可变映射,但你能够经过其余方式获取相同的操做——获取一个包含所须要的更新的新映射:

而且这种操做会将重复的映射进行更新。

同理,咱们也能够更新var变量

要从不可变映射中移除某个键,你能够用 - 操做符

总结:可变映射用 +=、-=。不可变映射用+、-。为何不可变不能用+=、-=?由于+=、-=不会生成新的映射,实在原来的映射中改变,所以不可变映射不能用+=、-=。而可变数组不能用+、-么?实际上是能够的,可是经过+、-操做后会生成新的映射,这对于可变数组来讲有些多此一举,可是对于不可变映射来讲让它有课能够“改变”的可能。

4.迭代映射

以下这段超简单的循环便可遍历映射中的全部键/值对偶

for ( (k , v) <- 映射 ) 处理k和v

 

若是要反转一个映射——交换键和值得位置,能够用

for ( (k , v) <- 映射 ) yield (v , k)

若是处于某种缘由,咱们只须要访问键或值,向Java同样,则能够用keySet和values方法。

keySet方法返回一个Set集合

values方法返回一个Iterable

注:在Scala中咱们把(k,v)叫作一个元组,映射不过是2维的元组的集合

5.映射排序

在操做映射时,咱们须要一个选定的实现:哈希表或者平衡树。默认状况下,Scala给的是哈希表。哈希表没有对键进行排序,而且仍是乱序,若是咱们须要有序的映射,咱们须要实现一个树形映射:

SortedMap是一个树形的映射,所以是有序的,而且他是一个可变映射(老版本是不可变的)

若是要安插入顺序访问全部的键,可使用LinkedHashMap:

6.与Java相互转化

Scala映射与Java映射之间的转换:

1.Java映射转Scala映射:

须要添加以下引用 

import scala.collection.JavaConversions.mapAsScalaMap

2.Scala映射转Java映射:

须要添加以下引用

import scala.collection.JavaConversions.mapAsJavaMap

7.元组

映射是键/值对偶的集合。对偶是元组(tuple)的最简单形态,元组是不一样类型的值得汇集。

注:对偶是二元元组的叫法。

元组的值是经过将单个的值包含在圆括号中构成。例如:

(1, 3.14, "Fred")

它是一个元组,类型为:

Tuple3[Int, Double, java.lang.String]  也能够写为 (Int, Double, java.lang.String)

因而可知,元组最多支持22元

--------------------------------------

元组如何访问?好比有以下元组:

val t = (1, 3.14, "Fred")

你就能够用方法_一、_二、_3访问其元组:

说明:你能够把t._2 写为t 2(用空格而不是句点),但不能写成t_2。

--------------------------------------

咱们还能够用元组来做为承接变量或者函数返回值,好比:

将咱们以前定义的元组 t 赋值给一个新的元组对象,远足中定义的各个部件将都会被赋值

有时咱们并不须要全部的部件,此时咱们能够将不须要的位置上用 _ 表示。

注:元组中定义的部件都是常量val。

有时咱们的韩式须要返回不仅一个值的状况。此时咱们能够用元组做为函数的返回值类型。

8.zip操做

使用元组的缘由之一是把多个值绑定在一块儿,以便他们可以一块儿被处理,一般能够用数组的zip方法完成。例如:

上面的例子太完美了,有可能两个数组不同长,这时:

咱们能够看到zip操做是安位置对应匹配的,匹配不到的就丢弃了。

--------------------------------------

toMap方法能够将对偶的集合转换成映射

相关文章
相关标签/搜索