scala(二)
一、映射
1、Scala映射就是键值对的集合Map。默认情况下,Scala中使用不可变的映射。 如果想使用可变集合Map,必须导入scala.collection.mutable.Map (导包时scala.collection.mutable._ 为可变;scala.collection.immutable._ 为不可变)
val map =Map("a"->10,"b"->11,"c"->12) 或者 val map =Map(("a",10),("b",11),("c",12))
创建可变map val map =scala.collection.mutable.Map("a"->10,"b"->11,"c"->12)
也可以创建hashmap val map =new scala.collection.mutable.HashMap[String,Int]
映射这种数据结构是一种将键映 射到值的函数。 区别在于通常的函数计算值, 而映射只是做查询。
2、获取映射中的值
val map1=map("a")
val map1=if(map.contain("a")) map("a") else 0 和下面的意义相同,相当于Java的三元运算符
val map1=map.getOrElse("a",0)
如果映射并不包含请求中使用的键, 则会抛出异常。 要检查映射中是否有某个指定的键, 可以用contains方法。 getOrElse方法, 若包含相应的键, 就返回这个键所对应的值, 否则返加0.
映射.get(键)这样的调用返回一个Option对象, 要么是Some(键对应的值), 要么是None。 如果map 中有的话 返回Some,没有返回None
3、修改map元素
更新可变map集合
更新map元素: map("a")=30
增加多个元素: map+=("d"->10,"e"->11)
移除元素:map-="d"
更新不可变map集合:
添加不可变Map的元素, 产生一个新的集合Map, 原Map不变 val ages2 = ages + ("Mike" -> 36, "Tom" -> 40)
移除不可变Map的元素, 产生一个新的集合Map, 原Map不变 val ages3 = ages - "Tom"
4、修改map的值
score("Bob")=10 前提map score是可变的
5、遍历map操作
遍历map的entrySet for ((key, value) <- ages) println(key + " " + value)
遍历map的key for (key <- ages.keySet) println(key)
遍历map的value for (value <- ages.values) println(value)
生成新map, 反转key和value for ((key, value) <- ages) yield (value, key)
map的值是不能重复的,如果反转后,key值相同的,后面的覆盖前面的
6、SortedMap和LinkedHashMap (上边的map不记插入的顺序,而且也不按key排序)
SortedMap可以自动对Map的key的排序 val ages = scala.collection.immutable.SortedMap("leo" -> 30, "alice" -> 15, "jen" -> 25)
LinkedHashMap可以记住插入entry的顺序
val ages = new scala.collection.mutable.LinkedHashMap[String, Int]
ages("leo") = 30
ages("alice") = 15
7、Java Map与Scala Map的隐式转换
Java Map 转换Scala Map
import scala.collection.JavaConversions.mapAsScalaMap;
class javaMapToScalaMap { def main(args: Array[String]): Unit = {
//创建Java的Map
val javaMap=new java.util.HashMap[String,Int]()
javaMap.put("a", 1)
javaMap.put("b", 2)
javaMap.put("c", 3) //将JAVA 的map转换成Scala的Map
val scalaMap: scala.collection.mutable.Map[String, Int] = javaMap
for((k,v)<-scalaMap) println(k+" "+v)
}
}
二、元组(tuple)
1、元组是不同类型的值的聚集 对偶是元组的最简单形态 元组的索引从1开始,而不是0,切记!
val tuple =(1,2.3,"li",true)
val a=tuple._2 结果为double类型的2.3
Tuple拉链操作 :Tuple拉链操作指的就是zip操作 zip操作, 是Array类的方法, 用于将两个Array, 合并为一个Array
比如Array(v1)和Array(v2), 使用zip操作合并后的格式为Array((v1,v2)) 合并后的Array的元素类型为Tuple
例:
val students = Array("Leo", "Jack", "Jen")
val scores = Array(80, 100, 90)
val studentScores = students.zip(scores)
如果取 值 例如 studentScores(1)._1 结果为"Jack"
如果长度不等,直接删除多余的元素
如果Array的元素类型是个Tuple, 调用Array的toMap方法, 可以将Array转换为Map studentScores.toMap
三、实例
移除第一个负数之后的所有负数
构建数组
val array = ArrayBuffer[Int]()
array += (1, 2, 3, 4, 5, -1, -3, -5, -9)
var foundFirstNegative = false
val keepIndexes = for (i <- 0 until a.length if !foundFirstNegative || array(i) >= 0)
yield {
if (array(i) < 0) foundFirstNegative = true
i
}
for (i <- 0 until keepIndexes.length) { array(i) = array(keepIndexes(i)) }
array.trimEnd(a.length - keepIndexes.length)
四、补充
1、Scala中的集合有三大类:序列(Seq)、集(Set)、映射(Map)
2、对数组进行排序还有一种方法 scala.util.Sorting.quickSort(array)
3、高阶数组
scala(二)的更多相关文章
- scala(二) Future执行逻辑解读
在scala中是没有原生线程的,其底层使用的是java的Thread机制.但是在scala中对java Thread进行了封装,实现了更便于操作线程的Future. 官方文档: Futures pro ...
- Scala(二)【基本使用】
一.变量和数据类型 1.变量 语法:val / var 变量名:变量类型 = 值 val name:String = "zhangsan" 注意 1.val定义的变量想到于java ...
- Scala(二):元组、数组、映射
元组:Tuple,不同类型值的聚集.将固定数量的项目组合在一起,以便它们可以作为一个整体传递. 与数组或列表不同,元组可以容纳不同类型的对象,但它们也是不可变的.元祖的实际类型取决于它的分量的类型,比 ...
- Scala(二) —— 函数
try 表达式 var result = try{ Integer.parseInt("dog") }catch{ case _ => 0 }finally{ println ...
- Scala快速概览
IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...
- Programming In Scala笔记-第八章、函数与闭包
当程序的代码量增大时,就需要对各功能模块进行分割,这些分割的小模块就是本文中接下来会进行分析的函数.接下来的部分会讲解包括函数嵌套,函数字面量,以及函数值等概念. 一.方法 一会函数一会方法的,是不是 ...
- Spark记录-Scala类和对象
本章将介绍如何在Scala编程中使用类和对象.类是对象的蓝图(或叫模板).定义一个类后,可以使用关键字new来创建一个类的对象. 通过对象可以使用定义的类的所有功能. 下面的图通过一个包含成员变量(n ...
- Spark学习笔记--安装SCALA和IDEA开发环境
一:安装Scala
- 快学Scala 第四课 (多维数组,与Java集合的互操作)
Scala二维数组的定义: val arr2 = Array.ofDim[String](2, 2) arr2(0)(0) = "aa" arr2(1)(0) = "bb ...
随机推荐
- loadrunner之做压力测试要做的准备
前提B/S架构 1.要有个备库和主库保存一致 到时候做压力测试的时候,要断开主库连接到备库.进行测试.以免主库出现垃圾数据.2.节点 判断单节点能承受多大的压力,如200万的用户账号,10万的在线用户 ...
- JMeter自学笔记1-环境安装
一.写在前面的话: Jmeter是一款优秀的开源测试工具, 是每位测试工程师进阶过程中,需要熟悉并掌握的一款测试工具,熟练使用Jmeter能大大提高工作效率. Jmeter环境安装需要依赖JDK,所以 ...
- 使用IntelRealScene设备结合Cocos引擎实现体感游戏开发
英特尔开发人员专区原文地址 Cocos游戏开发引擎对于广大开发者来说都比较熟悉,Intel RealScene是什么呢,简单理解是一种特殊的摄像头,可以捕捉用户的手势,面部表情等,进而实现AR,VR的 ...
- LeetCode 148——排序链表
1. 题目 2. 解答 2.1 快速排序 可参考 快速排序和归并排序 中的第一种快速排序思想,与在数组中排序有两点不同. 第一,我们需要取最后一个元素作为主元,在数组中可以直接访问到最后一个元素,但在 ...
- Activity 在横竖屏切换情况下的生命周期变化
title: Activity 在横竖屏切换情况下的生命周期变化 date: 2018-04-26 23:05:57 tags: [Activity] categories: [Mobile,Andr ...
- Django 使用 Celery 实现异步任务
对于网站来说,给用户一个较好的体验是很重要的事情,其中最重要的指标就是网站的浏览速度.因此服务端要从各个方面对网站性能进行优化,比如可采用CDN加载一些公共静态文件,如js和css:合并css或者js ...
- linux计划任务 学习笔记
原文链接: http://www.tsingfeng.com/?tag=cronjob 本文说的计划任务是指linux的Cronjob.语法 下面是个简单的计划任务: 10 * * * * /usr/ ...
- 《Linux内核与分析》第七周
by 21035130王川东 Linux内核如何装载和启动一个可执行程序 一. EIF文件格式: 1.ELF头部在文件的开始,描述文件的总体格式,保存了路线图,描述该文件的组织情况,即生成该文件系统的 ...
- Java 异常总结
Throwablede类是 Java 语言中所有错误或异常的超类. 两个子类的实例,Error 和 Exception Error 是 Throwablede 的子类,用于指示合理的应用程序不应该试图 ...
- MySQL的并发访问控制(锁)
前言:任何的数据集只要支持并发访问模型就必须基于锁机制进行访问控制 锁种类 读锁:共享锁,允许给其他人读,不允许他人写写锁:独占锁, 不允许其他人读和写 锁类型 显示锁:用户手动请求读锁或写锁隐式锁: ...