1. 构造映射

可以使用如下命令构造一个映射:

scala> val scores = Map("Alice" -> 90, "Kim" -> 89, "Bob"-> 98)
scores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 90, Kim -> 89, Bob -> 98)

上面构造了一个不可变的Map[String, Int],其值也不能被改变.如果想要一个可变映射,使用如下命令创建:

scala> val scores = scala.collection.mutable.Map("Alice" -> 90, "Kim" -> 89, "Bob"-> 98)
scores: scala.collection.mutable.Map[String,Int] = Map(Bob -> 98, Alice -> 90, Kim -> 89)

如果只想创建一个空的映射:

scala> val scores = new scala.collection.mutable.HashMap[String, Int]
scores: scala.collection.mutable.HashMap[String,Int] = Map()

从上面我们可以知道使用->操作符来创建映射的键值对元素

"Alice" -> 90

我们也可以使用下面的方式定义映射:

scala> val scores = Map(("Alice",90), ("Kim",89), ("Bob",98))
scores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 90, Kim -> 89, Bob -> 98)

2. 获取映射中的值

可以使用()来查找某个键对应的值:

scala> val bobscores = scores("Bob")
bobscores: Int = 98

如果映射中并不包含对应键的值,则会跑出异常,这与Java返回null不同:

scala> val tomScores = scores("Tom")
java.util.NoSuchElementException: key not found: Tom
  at scala.collection.MapLike$class.default(MapLike.scala:228)
  at scala.collection.AbstractMap.default(Map.scala:59)
  at scala.collection.MapLike$class.apply(MapLike.scala:141)
  at scala.collection.AbstractMap.apply(Map.scala:59)
  ... 32 elided

所以在获取某个键对应的值之前,要先检查映射中是否存在指定的键:

scala> val tomScores = if(scores.contains("Tom")) scores("Tom") else 0
tomScores: Int = 0

以下是一个快捷写法:

scala> val tomScores = scores.getOrElse("Tom", 0)
tomScores: Int = 0

3. 更新映射中的值

在可变映射中,可以更新某个映射的值,也可以添加一个新的键值对:

scala> val scores = scala.collection.mutable.Map("Alice" -> 90, "Kim" -> 89, "Bob"-> 98)
scores: scala.collection.mutable.Map[String,Int] = Map(Bob -> 98, Alice -> 90, Kim -> 89)
scala> scores("Alice")=100 // 更新键值对
scala> scores("Tom")=67 // 添加键值对
scala> println(scores)
Map(Bob -> 98, Tom -> 67, Alice -> 100, Kim -> 89)

还可以使用+=操作符来添加多个关系:

scala> scores += ("Bob" -> 78, "Fred" -> 89)
res3: scores.type = Map(Bob -> 78, Fred -> 89, Tom -> 67, Alice -> 100, Kim -> 89)

还可以使用-=操作符移除某个键对应的值:

scala> scores -= "Tom"
res4: scores.type = Map(Bob -> 78, Fred -> 89, Alice -> 100, Kim -> 89)

虽然不可以更新一个不可变的映射,但是我们利用一些操作产生一个新的映射,并可以对原映射中的键值对进行修改或者添加新的键值对:

scala> val scores = Map("Alice" -> 90, "Kim" -> 89, "Bob"-> 98)
scores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 90, Kim -> 89, Bob -> 98)

scala> val newScores = scores + ("Kim" -> 78, "Tom" -> 54)
newScores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 90, Kim -> 78, Bob -> 98, Tom -> 54)

上例中scores是不可变映射,我们在它基础上对"Kim"进行了修改,添加了"Tom",产生了一个新的映射newScores

4. 迭代映射

可以使用如下命令迭代映射:

scala> for( key <- scores.keySet ) println(key + "---" + scores(key))
Alice---90
Kim---89
Bob---98

或者

scala> for( value <- scores.values ) println(value)
90
89
98

5. 排序映射

在操作映射时,我们需要选定一个映射(哈希表还是平衡树).默认情况下,scala给的是哈希表.有时候我们想对键进行一个排序,顺序访问键,这就需要一个树形映射:

scala> val scores = scala.collection.immutable.SortedMap("Alice" -> 90, "Kim" -> 89, "Bob"-> 98)
scores: scala.collection.immutable.SortedMap[String,Int] = Map(Alice -> 90, Bob -> 98, Kim -> 89)

6. 与Java互操作

如果你有一个Java映射,想要转换为Scala映射,以便便捷的使用Scala映射的方法,只需要增加如下语句:

import scala.collection.JavaConversions.mapAsScalaMap

然后指定Scala映射类型来出发转换:

scala> val scores : scala.collection.mutable.Map[String,Int] = new java.util.TreeMap[String, Int]
scores: scala.collection.mutable.Map[String,Int] = Map()

还可以将java.util.Properties到Map[String, String]的转换:

scala> import scala.collection.JavaConversions.propertiesAsScalaMap
import scala.collection.JavaConversions.propertiesAsScalaMap

scala> val props : scala.collection.Map[String, String] = System.getProperties()
props: scala.collection.Map[String,String] =
Map(env.emacs -> "", java.runtime.name -> Java(TM) SE Runtime Environment, sun.boot.library.path -> /home/xiaosi/opt/jdk-1.8.0/jre/lib/amd64, java.vm.version -> 25.91-b14, java.vm.vendor -> Oracle Corporation, ...

相反,如果想要把Scal映射转换为Java映射,只需要提供相反的隐式转换即可:

scala> import scala.collection.JavaConversions.mapAsJavaMap
import scala.collection.JavaConversions.mapAsJavaMap

scala> import java.awt.font.TextAttribute._ // 引入下面的映射会用到的键
import java.awt.font.TextAttribute._

scala> val attrs = Map(FAMILY -> "Serif", SIZE -> 12) // Scala映射
attrs: scala.collection.immutable.Map[java.awt.font.TextAttribute,Any] = Map(java.awt.font.TextAttribute(family) -> Serif, java.awt.font.TextAttribute(size) -> 12)

scala> val font = new java.awt.Font(attrs) // Java映射
font: java.awt.Font = java.awt.Font[family=Serif,name=Serif,style=plain,size=12]

7. 元组Tuple

元组是不同类型的值的聚合,元组的值通过将单个的值包含在圆括号中构成的:

scala> val bobScore = (1, 98.5, "Bob")
bobScore: (Int, Double, String) = (1,98.5,Bob)

可以使用方法_1_2_3访问其组员:

scala> val bobScore = (1, 98.5, "Bob")
bobScore: (Int, Double, String) = (1,98.5,Bob)

scala> bobScore._1
res10: Int = 1

scala> bobScore._3
res11: String = Bob

通常,使用模式匹配的方式来获取元组的组元:

scala> val (id, score, name) = bobScore // 将变量id赋值为1,变量score赋值为98.5,变量name赋值为Bob
   val bobScore: (Int, Double, String)

scala> val (id, score, name) = bobScore
id: Int = 1
score: Double = 98.5
name: String = Bob

scala> println("name = " + name + ", score = " + score + ", name = " + name)
name = Bob, score = 98.5, name = Bob

[Scala]Scala学习笔记三 Map与Tuple的更多相关文章

  1. Scala入门学习笔记三--数组使用

    前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...

  2. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  3. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

  4. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  5. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  6. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  7. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  8. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  9. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

随机推荐

  1. 常用模块(random,os,json,pickle,shelve)

    常用模块(random,os,json,pickle,shelve) random import random print(random.random()) # 0-1之间的小数 print(rand ...

  2. 杭电1024Max Sum Plus Plus

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目: Problem Description Now I think you have got a ...

  3. HihoCoder - 1339 Dice Possibility(概率dp)

    题意:求用N(1<=N<=100)个骰子掷出M(1<=M<=600)的概率 分析:直接求概率可能出现6^100次方,会爆精度.可以用一个数组dp[i][j]记录用i个骰子掷出j ...

  4. mybatis 复习笔记01

    本文内容转自传智播客笔记 1. 问题总结  1). 数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能. 设想:使用数据库连接池管理数据库连 ...

  5. ASP.NET WebAPI2 发布之后404 Not Found

    方法一:首先确保服务器安装.Net FrameWork 4.0 并且注册IIS 方法二:对应应用程序池版本为v4.0,模式为集成 方法三:在web.config中加入 <system.webSe ...

  6. Spark机器学习3·推荐引擎(spark-shell)

    Spark机器学习 准备环境 jblashttps://gcc.gnu.org/wiki/GFortranBinaries#MacOS org.jblas:jblas:1.2.4-SNAPSHOT g ...

  7. Nested DollsHDU1677

    /*题意:有n个矩形,用长和宽表示,如果一个的长和宽都比另一个小,那么这个嵌放在另一个中 所以先对w从大到小排序,w一样的按h从小到大排序,那么就从后面的箱子往前找,只要前面找到一个人h比自己大的就放 ...

  8. Vim:gvim安装配置(windows)

    Vim:gvim安装配置(windows) 一.gvim的特点: vim要求全部键盘操作,而gvim可以使用鼠标进行可视化操作,即gvim是vim的图形化界面: 二.gvim安装: 下载地址:http ...

  9. Python3.x:PDFMiner3k在线、本地解析pdf

    Python3.x:PDFMiner3k在线.本地解析pdf 安装 pip install pdfminer3k 示例一:在线解析pdf ''' Demo:pdf2htmlex解析pdf Dateti ...

  10. [Android]android Service后台防杀

    网上有很多办法,方法一:在JNI里面fork出子进程service在单独的进程中,在service中调用JNI的代码,然后fork出一个进程,然后让我们的service进程和fork出来的子进程一直运 ...