scala的多种集合的使用(6)之映射Map的操作方法
1.创建映射
1)创建不可变的映射
scala> val status = Map(1 -> "a",2 -> "b")
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b) scala> val status = Map((1,"a"),(2,"b"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)
2)创建可变的映射,要么用导入的方式将其带入作用域中,要么就在创建实例时指定scala.collection.mutable.Map类的完整路径。
scala> var status = collection.mutable.Map((1,"a"),(2,"b"))
status: scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a)
3)在创建的时候创建一空可变的Map,之后在添加元素。
scala> var status = collection.mutable.Map[Int,String]()
status: scala.collection.mutable.Map[Int,String] = Map() scala> status += ((1,"a"))
res38: scala.collection.mutable.Map[Int,String] = Map(1 -> a) scala> status += ((3,"c"),(2,"b"))
res39: scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a, 3 -> c)
2.Map使用的场景
1)想要返回元素按照键有序的映射,请使用SortedMap。
scala> import scala.collection.SortedMap
import scala.collection.SortedMap scala> val grades = SortedMap(("kim",90),("al",86),("mes",88),("ema",78),("han",93))
grades: scala.collection.SortedMap[String,Int] = Map(al -> 86, ema -> 78, han ->93, kim -> 90, mes -> 88) scala> val grades = SortedMap((1,90),(3,86),(2,88),(5,78),(4,93))
grades: scala.collection.SortedMap[Int,Int] = Map(1 -> 90, 2 -> 88, 3 -> 86, 4 -> 93, 5 -> 78)
2)按插入时的顺序返回元素,只有可变的LinkedHashMap。
scala> import scala.collection.mutable.LinkedHashMap
import scala.collection.mutable.LinkedHashMap scala> var status = LinkedHashMap((5,"apple"))
status: scala.collection.mutable.LinkedHashMap[Int,String] = Map(5 -> apple) scala> status += ((3,"orange"))
res40: scala.collection.mutable.LinkedHashMap[Int,String] = Map(5 -> apple, 3 -> orange) scala> status += ((6,"banana"))
res41: scala.collection.mutable.LinkedHashMap[Int,String] = Map(5 -> apple, 3 ->orange, 6 -> banana)
3)按插入时的相反顺序返回元素,可以是可变的或者不可变的ListMap。
scala> import scala.collection.mutable.ListMap
import scala.collection.mutable.ListMap scala> var status = ListMap((1,"a"))
status: scala.collection.mutable.ListMap[Int,String] = Map(1 -> a) scala> status += ((1,"a"))
res43: scala.collection.mutable.ListMap[Int,String] = Map(1 -> a) scala> status += ((2,"b"))
res44: scala.collection.mutable.ListMap[Int,String] = Map(2 -> b, 1 -> a) scala> status += ((3,"c"))
res45: scala.collection.mutable.ListMap[Int,String] = Map(3 -> c, 1 -> a, 2 -> b)
3.可变映射的添加、更新和删除元素
1)通过给键指定值的方式为可变映射添加元素。
scala> var status = scala.collection.mutable.Map[String,String]()
status: scala.collection.mutable.Map[String,String] = Map() scala> status("a1") = "a1a" scala> status
res47: scala.collection.mutable.Map[String,String] = Map(a1 -> a1a)
2)通过+=方法添加一个或者多个元素。
scala> var status = scala.collection.mutable.Map[String,String]()
status: scala.collection.mutable.Map[String,String] = Map() scala> status += (("a1","a1a"))
res50: status.type = Map(a1 -> a1a) scala> status
res51: scala.collection.mutable.Map[String,String] = Map(a1 -> a1a) scala> status += (("a1","a1a"),("a2","a2a"))
res52: status.type = Map(a1 -> a1a, a2 -> a2a) scala> status
res53: scala.collection.mutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a)
3)用++=从另一个集合添加多个元素。
scala> var status = scala.collection.mutable.Map[String,String]()
status: scala.collection.mutable.Map[String,String] = Map() scala> status ++= List(("a1","a1a"),("a2","a2a"))
res55: status.type = Map(a1 -> a1a, a2 -> a2a)
4)用-=的方法通过指定元素的键从映射中删除一个或者多个元素。
scala> status ++= List(("a1","a1a"),("a2","a2a"))
res56: status.type = Map(a1 -> a1a, a2 -> a2a) scala> status -= "a1"
res57: status.type = Map(a2 -> a2a) scala> status
res58: scala.collection.mutable.Map[String,String] = Map(a2 -> a2a) scala> status -= ("a1","a2")
res60: status.type = Map() scala> status
res61: scala.collection.mutable.Map[String,String] = Map()
5)用--=删除集合里的指定的元素。
scala> var status = scala.collection.mutable.Map[String,String]()
status: scala.collection.mutable.Map[String,String] = Map() scala> status ++= List(("a1","a1a"),("a2","a2a"))
res67: status.type = Map(a1 -> a1a, a2 -> a2a) scala> status --= List("a1","a2")
res68: status.type = Map() scala> status
res69: scala.collection.mutable.Map[String,String] = Map()
6)通过赋值值给元素的键更新元素。
scala> var status = scala.collection.mutable.Map[String,String]()
status: scala.collection.mutable.Map[String,String] = Map() scala> status ++= List(("a1","a1a"),("a2","a2a"))
res72: status.type = Map(a1 -> a1a, a2 -> a2a) scala> status("a1") = "hello world" scala> status
res74: scala.collection.mutable.Map[String,String] = Map(a1 -> hello world, a2 -> a2a)
4.不可变映射的添加、更新和删除元素
1)用+个方法添加一个或者多个元素,在这个过程中将结果赋给一个新的变量。
scala> val a = Map(("a1","a1a"))
a: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a) scala> val b = a + (("a2","a2a"))
b: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a) scala> val c = b + (("a3","a31"),("a4","a4a"))
c: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3 -> a31, a4 -> a4a)
2)更新一个不可变映射的键值对,需要用+方法对键/值重新赋值,新值替换旧值。
scala> val a = Map(("a1","a1a"))
a: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a) scala> val b = a + (("a2","a2a"))
b: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a) scala> val c = b + (("a1","hello world"))
c: scala.collection.immutable.Map[String,String] = Map(a1 -> hello world, a2 -> a2a)
3)使用-方法删除一个或者多个元素。
scala> val a = Map(("a1","a1a"))
a: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a) scala> val b = a + (("a2","a2a"),("a3","a3a"),("a4","a4a"))
b: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3
-> a3a, a4 -> a4a) scala> val c = b - "a1" - "a2"
c: scala.collection.immutable.Map[String,String] = Map(a3 -> a3a, a4 -> a4a) scala> val d = c - "a4"
d: scala.collection.immutable.Map[String,String] = Map(a3 -> a3a)
当一个不可变的变量声明为var时,它仍然是一个不可变的映射,不能给映射中的元素重新赋值。
5.映射值的访问
1)访问保存在映射中单独的值,如果键不存在,会抛出异常。为了避免这个问题,可以在创建映射时使用withDefaultValue的方法。该方法会创建一个默认值,如果键没有找到,映射会返回这个值。
scala> val status = Map((1,"a"),(2,"b"),(3,"c")).withDefaultValue("Not Found")
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c) scala> status(4)
res5: String = Not Found scala> status(3)
res6: String = c
2)寻找键时可以使用getOrElse方法,当指定的键找不到时,会返回默认值。
scala> val status = Map((1,"a"),(2,"b"),(3,"c"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c) scala> val s = status.getOrElse(6,"Not such value")
s: String = Not such value
3)可以使用get方法返回Option对象。
scala> val status = Map((1,"a"),(2,"b"),(3,"c"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c) scala> val s = status.get(5)
s: Option[String] = None scala> val s = status.get(2)
s: Option[String] = Some(b)
6.映射的遍历
1)for循环遍历所有的映射元素。
scala> val status = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d) scala> for((k,v) <- status) println(s"key: $k, value: $v")
key: 1, value: a
key: 2, value: b
key: 3, value: c
key: 4, value: d
2)匹配表达式配合foreach方法。
scala> val status = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d) scala> status.foreach{
| case(k,v) => println(s"key: $k,value: $v")
| }
key: 1,value: a
key: 2,value: b
key: 3,value: c
key: 4,value: d
3)使用Tuple语法访问键/值字段。
scala> val status = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d) scala> status.foreach(x => println(s"key: ${x._1},value: ${x._2}"))
key: 1,value: a
key: 2,value: b
key: 3,value: c
key: 4,value: d
4)如果想要映射中所有的键,keys方法返回Iterable。
scala> val status = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d) scala> status.keys.foreach((key) => println(key))
1
2
3
4
5)如果想要映射中所有的value的值,用values方法可以遍历映射中所有的值。
scala> val status = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
status: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d) scala> status.values.foreach((value) => println(value))
a
b
c
d
7.操作映射的值
1)如果要遍历映射并对每个值进行操作,mapValues是个不错的选择。它可以在每个映射值上执行一个函数,然后返回修改后的映射。
scala> var x = collection.mutable.Map((1,"a"),(2,"b"))
x: scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a) scala> val y = x.mapValues(_.toUpperCase)
y: scala.collection.Map[Int,String] = Map(2 -> B, 1 -> A)
2)transform方法可以同时使用键/值实现一个变换方法。
scala> val map = Map((1,10),(2,20),(3,30))
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 10, 2 -> 20, 3 -> 30) scala> val newMap = map.transform((k,v) => k + v)
newMap: scala.collection.immutable.Map[Int,Int] = Map(1 -> 11, 2 -> 22, 3 -> 33)
8.从映射中获取所有的键和值
1)用keySet的方法将以集合的方式获取所有的键。
scala> val status = Map(("a1","a1a"),("a2","a2a"),("a3","a3a"))
status: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3 -> a3a) scala> status.keySet
res14: scala.collection.immutable.Set[String] = Set(a1, a2, a3)
2)用keys方法获得一个Iterable。
scala> status.keys
res16: Iterable[String] = Set(a1, a2, a3)
3)用keysIterator方法获取所有作为迭代器的键。
scala> status.keysIterator
res17: Iterator[String] = non-empty iterator
4)使用values方法可以获取映射中所有的值,并将结果转化为Iterable对象。
scala> status.values
res18: Iterable[String] = MapLike(a1a, a2a, a3a)
5)使用valuesIterator方法,返回Iterator对象。
scala> status.valuesIterator
res19: Iterator[String] = non-empty iterator
keysIterator和valuesIterator方法都会从映射数据返回一个迭代器。这些方法不会创建一个新的集合,仅仅是提供遍历已存在的迭代器。
9.反转键值
可以用for推导反转映射的键值,然后将结果赋给一个新的变量。但是映射中,key是不重复的,value是可以重复的,但是在反转时可能会丢掉数据。
scala> val status = Map(("a1","a1a"),("a2","a2a"),("a3","a3a"))
status: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3 -> a3a) scala> val newMap = for((k,v) <- status) yield (v,k)
newMap: scala.collection.immutable.Map[String,String] = Map(a1a -> a1, a2a -> a2, a3a -> a3)
10.测试映射中键/值的存在
1)用contains方法测试映射中是否包含键。
scala> val status = Map(("a1","a1a"),("a2","a2a"),("a3","a3a"))
status: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3 -> a3a) scala> if (status.contains("a1")) println("found a1") else println("not found")
found a1 scala> if (status.contains("a5")) println("found a5") else println("not found")
not found
2)使用valuesIterator方法搜索值,结合exists和contains。
scala> val status = Map(("a1","a1a"),("a2","a2a"),("a3","a3a"))
status: scala.collection.immutable.Map[String,String] = Map(a1 -> a1a, a2 -> a2a, a3 -> a3a) scala> status.valuesIterator.exists(_.contains("a2a"))
res22: Boolean = true scala> status.valuesIterator.exists(_.contains("a2a2"))
res23: Boolean = false
11.根据键或者值对映射排序
1)可以用sortBy方法对值(_2)/键(_1)从低到高进对映射进行排序。
scala> val grade = Map((1,98),(2,89),(3,88),(4,93),(5,95))
grade: scala.collection.immutable.Map[Int,Int] = Map(5 -> 95, 1 -> 98, 2 -> 89, 3 -> 88, 4 -> 93) scala> import scala.collection.immutable.ListMap
import scala.collection.immutable.ListMap scala> ListMap(grade.toSeq.sortBy(_._2):_*)
res25: scala.collection.immutable.ListMap[Int,Int] = Map(3 -> 88, 2 -> 89, 4 -> 93, 5 -> 95, 1 -> 98)
2)可以用sortWith方法对值(_2)/键(_1)按照升序或者降序对值进行排序。
//按照值升序:
scala> ListMap(grade.toSeq.sortWith(_._2 < _._2):_*)
res28: scala.collection.immutable.ListMap[Int,Int] = Map(3 -> 88, 2 -> 89, 4 ->93, 5 -> 95, 1 -> 98)
//按照值降序:
scala> ListMap(grade.toSeq.sortWith(_._2 > _._2):_*)
res29: scala.collection.immutable.ListMap[Int,Int] = Map(1 -> 98, 5 -> 95, 4 ->93, 2 -> 89, 3 -> 88)
关于_*:
它的作用是将数据转换,然后将其作为多个参数传给ListMap。
12.映射中键值的最值
1)对键进行排序。
scala> val grade = Map((1,98),(2,89),(3,88),(4,93),(5,95))
grade: scala.collection.immutable.Map[Int,Int] = Map(5 -> 95, 1 -> 98, 2 -3 -> 88, 4 -> 93) scala> grade.max
res31: (Int, Int) = (5,95) scala> grade.keysIterator.max
res32: Int = 5 scala> grade.keysIterator.reduceLeft((x,y) => if(x > y) x else y)
res33: Int = 5
2)对值进行排序 。
scala> val grade = Map((1,98),(2,89),(3,88),(4,93),(5,95))
grade: scala.collection.immutable.Map[Int,Int] = Map(5 -> 95, 1 -> 98, 2 -> 89,3 -> 88, 4 -> 93) scala> grade.valuesIterator.max
res40: Int = 98 scala> grade.valuesIterator.reduceLeft((x,y) => if(x > y) x else y)
res41: Int = 98 scala> grade.valuesIterator.reduceLeft(_ max _)
res42: Int = 98
scala的多种集合的使用(6)之映射Map的操作方法的更多相关文章
- scala的多种集合的使用(7)之集Set的操作方法
1.给集添加元素 1)用+=.++=和add给可变集添加元素. scala> var set = scala.collection.mutable.Set[Int]() set: scala.c ...
- scala的多种集合的使用(1)之集合层级结构与分类
一.在使用scala集合时有几个概念必须知道: 1.谓词是什么? 谓词就是一个方法,一个函数或者一个匿名函数,接受一个或多个函数,返回一个Boolean值. 例如:下面方法返回true或者false, ...
- scala的多种集合的使用(5)之数组Array(ArrayBuffer)的操作
1.创建和更新数组的不同方式 1)定义一个数组的初始大小和类型,随后填充值. scala> val array = new Array[String](3) array: Array[Strin ...
- scala的多种集合的使用(4)之列表List(ListBuffer)的操作
1.List列表的创建和添加元素 1)最常见的创建list的方式之一. scala> val list = 1 :: 2 :: 3 :: Nil list: List[Int] = List(1 ...
- scala的多种集合的使用(3)之遍历集合的方法
遍历集合的方法 1.用foreach循环遍历一个集合 foreach接收一个函数作为参数.定义的函数应该接收一个元素作为输入参数,然后不要返回任何的东西.输入的参数的类型应该匹配集合中的类型.随着fo ...
- scala的多种集合的使用(2)之集合常用方法
一.常用的集合方法 1.可遍历集合的常用方法 下表列出了Traverable在所有集合常用的方法.接下来的符号: c代表一个集合 f代表一个函数 p代表一个谓词 n代表一个数字 op代表一个简单的操作 ...
- scala的多种集合的使用(8)之队列和栈的操作方法
1.使用队列 队列是一种那个先进先出的队列.1)创建一个队列. scala> import scala.collection.mutable.Queue import scala.collect ...
- Programming In Scala笔记-第十七章、Scala中的集合类型
本章主要介绍Scala中的集合类型,主要包括:Array, ListBuffer, Arraybuffer, Set, Map和Tuple. 一.序列 序列类型的对象中包含多个按顺序排列好的元素,可以 ...
- Scala基础:数组(Array)、映射(Map)、元组(Tuple)、集合(List)
数组 package com.zy.scala object ArrayDemo { def main(args: Array[String]): Unit = { //定长数组 val arr1 = ...
随机推荐
- MySQL 表名和字段名不要使用保留字命名
今天测试代码,新建了一张 Order 表,使用的 MySQL 数据库. 插入数据的时候报语法错误,我检查了好几遍,也没看出 SQL 语句哪里有问题,于是从 MyBatis 的日志里拷贝出 SQL 语句 ...
- 音频处理EQ的基本概念
我们通常所说的人声,歌声以及乐声都是一个复合音,也就是由声音的基音和一系列的泛音所构成的.这些泛音都是基音频率的倍数,物理学中叫分音,电声学中叫谐波,音乐中则把它们称做泛音.可以说,泛音对音色的特性 ...
- 万能的Python,还能用来制作高大上的进度条?
对于开发或者运维来说,使用Python去完成一些跑批任务,或者做一些监控事件是非常正常的情况.那么如何有效的监控任务的进度,除了在任务中加上log外,还能不能有另一种方式来了解任务进展到哪一步了呢? ...
- 小白都会超详细--ELK日志管理平台搭建教程
目录 一.介绍 二.安装JDK 三.安装Elasticsearch 四.安装Logstash 五.安装Kibana 六.Kibana简单使用 系统环境:CentOS Linux release 7.4 ...
- Java进阶篇设计模式之四 -----适配器模式和桥接模式
前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ...
- springboot项目容器化
创建一个简单的springboot项目,依赖中加入: 编写一个Restfull接口: 编写启动类: 启动项目,浏览器访问该接口,得到想要的结果.下面,就将这个项目进行Docker容器化(applica ...
- 使用Atlas进行元数据管理之Type(类型)
背景:笔者和团队的小伙伴近期在进行数据治理/元数据管理方向的探索, 在接下来的系列文章中, 会陆续与读者们进行分享在此过程中踩过的坑和收获. 元数据管理系列文章: [0] - 使用Atlas进行元数据 ...
- async/Await使用和原理
await/async是.NetFramework4.5出现的,是语法糖,由编译器提供的功能! await/async 是C#保留关键字,通常是成对出现,一般的建议是:要么不用,要么用到底 async ...
- 工具资源系列之给mac装个虚拟机
mac 系统安装虚拟机目前有两种主流软件,一种是 Parallels Desktop ,另一种是 vmware. 本教程选用的是 vmware ,因为我之前 windows 上安装的虚拟机软件就是vm ...
- JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
一.JS引入方式 什么是JavaScript? JavaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互,JavaScript是浏览 ...