【Scala】关于集合的各种知识点
目录
映射Map
Map可以分为可变Map和不可变Map,默认情况是不可变Map。两者之间的定义格式完全相同,区别在于导包
不可变Map
概述
有两种定义格式:
1.val m1 = Map(k1 -> v1,k2 -> v2,k3 -> v3)
2.val m2 = Map((k1 , v1),(k2 , v2),(k3 , v3))
可以进行的操作:
1.获取值 —— m1(k1) = v1 \ m1.get(k1) = v1 \ m1.getOrElse(k1,默认值) (最后一种比较推荐,如果查询的key有value,就输出value,如果没有,则输出给定的默认值)
2.查看指定的key是否存在 —— m1.key(k1) 输出结果为布尔类型,存在则为true,不存在则为false
3.查看Map集合中所有的key —— m1.keys
操作实例
//两种定义格式
scala> val m1 = Map("name" -> "zhangsan","age" -> 20,"sex" -> "女")
m1: scala.collection.immutable.Map[String,Any] = Map(name -> zhangsan, age -> 20, sex -> 女)
scala> val m2 = Map(("name","haha"),("age",18),("sex","男"))
m2: scala.collection.immutable.Map[String,Any] = Map(name -> haha, age -> 18, sex -> 男)
//value查询
scala> m1("name")
res9: Any = zhangsan
scala> m1.get("age")
res10: Option[Any] = Some(20)
scala> m1.getOrElse("sex","男")
res12: Any = 女
//key查询
scala> m1.keySet("name")
res13: Boolean = true
scala> m1.keySet("height")
res15: Boolean = false
scala> m1.keys
res18: Iterable[String] = Set(name, age, sex)
可变Map
概述
首先要手动导包 —— import scala.collection.mutable.Map
剩下定义格式和查看操作与不可变Map一样
多于可变Map的操作:
修改value —— m1(k1) = 新的value
增加元素 —— m1 += (k3 -> v3) \ m1 += ((k3 , v3)) (和定义格式一样有两种)
删除元素 —— m1 -= (k1) \ m1.remove(k1)
操作实例
scala> val m2 = Map(("name","haha"),("age",18),("sex","男"))
m2: scala.collection.mutable.Map[String,Any] = Map(age -> 18, name -> haha, sex -> 男)
//修改value
scala> m2("name")="alias"
scala> m2("name")
res24: Any = alias
//增加元素
scala> m2 += ("height" -> 180.5)
res25: m2.type = Map(age -> 18, name -> alias, height -> 180.5, sex -> 男)
scala> m2 += (("city","beijing"))
res26: m2.type = Map(city -> beijing, age -> 18, name -> alias, height -> 180.5, sex -> 男)
//删除元素
scala> m2 -= ("height")
res27: m2.type = Map(city -> beijing, age -> 18, name -> alias, sex -> 男)
scala> m2.remove("city")
res28: Option[Any] = Some(beijing)
Map的遍历
遍历方法有两种:for循环遍历、模式匹配遍历
for循环遍历
格式
for(i <- m1.keys) println (m1(i))
操作实例
scala> for(i <- m1.keys) println(m1(i))
zhangsan
20
女
模式匹配遍历
格式
for((x,y) <- m1) println(x+"——"+y)
操作实例
scala> for((x,y) <- m1) println(x+"——"+y)
name——zhangsan
age——20
sex——女
Tuple 元祖
概述
由()括起来的,不同类型数据的聚集称为元祖。
当元祖中只有两个元素时,就和Map极其相似,称为对偶元祖。
元祖中的元素值无法修改。
定义格式
//第一种格式
val t1 = (元素1,元素2,元素3,...)
//第二种格式
scala内置了22个TupleN对象,需要时可以直接new Tuple来创建元祖
scala> val t2 = new Tuple
Tuple1 Tuple10 Tuple11 Tuple12 Tuple13 Tuple14 Tuple15 Tuple16 Tuple17 Tuple18 Tuple19
Tuple2 Tuple20 Tuple21 Tuple22 Tuple3 Tuple4 Tuple5 Tuple6 Tuple7 Tuple8 Tuple9
val t2 = new Tuple3(元素1,元素2,元素3)
//显而易见,第一种格式更为简便,一般情况下都是用第一种格式
获取元素方法
scala> t1._
_1 _2 _3 _4
想要获取元素时,用_1,_2,_3,...即可
元祖遍历
t1.productIterator() //该方法会返回一个迭代器
t1.producrIterator.foreach(println(_)) //遍历格式
操作实例
//创建元祖
scala> val t1 = (123,"hello",true,3.14)
t1: (Int, String, Boolean, Double) = (123,hello,true,3.14)
scala> val t2 = new Tuple4(456,"AMDyes","false",7.777)
t2: (Int, String, String, Double) = (456,AMDyes,false,7.777)
//获取元素
scala> t1._2
res32: String = hello
scala> t2._2
res33: String = AMDyes
//元祖遍历(看着是两种形式,其实是一种方法,第一种更简便)
scala> t1.productIterator.foreach(println(_))
123
hello
true
3.14
scala> t2.productIterator.foreach(i => println(i))
456
AMDyes
false
7.777
List 列表
List分为可变List和不可变List,默认情况是不可变List,区别不仅仅在于导包。
不可变List
概述
格式 —— val l1 = List(元素1,元素2,...)
相关方法
l1.head —— 返回集合的第一个元素
l1.tail —— 返回除了第一个元素外,其他元素组成的集合
val l1 = Nil —— Nil表示的是一个空集合,List()
相关操作
10 +: l1 —— 在集合头部添加元素
10 :: l1 —— 在集合头部添加元素
l1 :+ 10 —— 在集合尾部添加元素
操作实例
//创建List
scala> val l1 = List(12,34,56,78)
l1: List[Int] = List(12, 34, 56, 78)
//返回集合第一个元素
scala> l1.head
res38: Int = 12
//返回集合除了第一个元素的其他元素组成的集合
scala> l1.tail
res40: List[Int] = List(34, 56, 78)
//在集合头部添加元素
scala> 10 +: l1
res41: List[Int] = List(10, 12, 34, 56, 78)
//相当于l1调用了+:方法,10是参数
scala> l1.+:(10)
res42: List[Int] = List(10, 12, 34, 56, 78)
//因为l1为不可变List,所以+:的操作并没有修改l1,而是形成了一个新的集合
scala> l1
res43: List[Int] = List(12, 34, 56, 78)
scala> val l2 = 10 +: l1
l2: List[Int] = List(10, 12, 34, 56, 78)
scala> l2
res44: List[Int] = List(10, 12, 34, 56, 78)
//同样是在头部添加一个元素,和+:一样
scala> 10 :: l1
res45: List[Int] = List(10, 12, 34, 56, 78)
//在尾部添加一个元素
scala> l1 :+ 10
res46: List[Int] = List(12, 34, 56, 78, 10)
可变List
概述
第一步要先导包:import scala.collection.mutable.ListBuffer
格式 —— val l2 = ListBuffer[元素类型](元素1,元素2,...)
相关方法
和不可变List相同
相关操作
上述不可变List的操作同样可以使用在可变List
l2.append(元素值) —— 增加元素
l2 += 元素值 —— 增加元素
l2.remove(元素索引) —— 删除元素
l2 -= 元素值 —— 删除元素
操作实例
//导包
scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer
//创建可变List
scala> val l2 = ListBuffer[Int](11,22,33,44)
l2: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 22, 33, 44)
//增加元素
scala> l2 += 10
res51: l2.type = ListBuffer(11, 22, 33, 44, 10)
scala> l2.append(20)
//因为是可变List,所以增加元素的操作是改变了l2的元素值
scala> l2
res53: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 22, 33, 44, 10, 20)
//删除元素
scala> l2 -= 20
res54: l2.type = ListBuffer(11, 22, 33, 44, 10)
scala> l2.remove(4)
res55: Int = 10
scala> l2
res56: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 22, 33, 44)
Set 集合
Set集合也分为可变Set和不可变Set,默认为不可变Set,创建使用可变Set要导包
可变Set和不可变Set的格式、特点都相同,差别只在于可变与否
格式
val s1 = Set(元素1,元素2,...)
特点
1.元素不重复,即使创建时输入相同的元素,scala也会进行一个去重的操作
2.元素无序,也即没有了索引的概念
相关操作
只对可变Set可用:
增加元素 —— s1 += 元素值 \ s1.add(元素值)
删除元素 —— s1 -= 元素值 \ s1.remove(元素值)(因为Set没有索引,所以此处的remove方法和其他集合不同,只能填入元素值)
操作实例
//既体现了元素的不重复特点,又体现了元素的无序性
scala> val s1 = Set(1,1,2,2,4,4,6,6,6,7)
s1: scala.collection.immutable.Set[Int] = Set(1, 6, 2, 7, 4)
//是集合,所以查看集合长度,求和,求最大最小值的方法都可以
scala> s1.size
res57: Int = 5
scala> s1.sum
res58: Int = 20
scala> s1.min
res59: Int = 1
/**
*两个集合求交集、并集、差集
**/
//两个Set集合如下
scala> s1
res60: scala.collection.immutable.Set[Int] = Set(1, 6, 2, 7, 4)
scala> s2
res61: scala.collection.immutable.Set[Int] = Set(2, 7, 3, 8, 4)
//交集
scala> s1.&(s2)
res62: scala.collection.immutable.Set[Int] = Set(2, 7, 4)
scala> s1 & s2
res63: scala.collection.immutable.Set[Int] = Set(2, 7, 4)
//并集
scala> s1.++(s2)
res67: scala.collection.immutable.Set[Int] = Set(1, 6, 2, 7, 3, 8, 4)
scala> s1 ++ s2
res65: scala.collection.immutable.Set[Int] = Set(1, 6, 2, 7, 3, 8, 4)
//差集
scala> s1.--(s2)
res68: scala.collection.immutable.Set[Int] = Set(1, 6)
scala> s1 -- s2
res69: scala.collection.immutable.Set[Int] = Set(1, 6)
scala> s2 -- s1
res70: scala.collection.immutable.Set[Int] = Set(3, 8)
scala> s2.diff(s1)
res71: scala.collection.immutable.Set[Int] = Set(3, 8)
【Scala】关于集合的各种知识点的更多相关文章
- Scala:集合类型Collection和迭代器
http://blog.csdn.net/pipisorry/article/details/52902549 Scala Collection Scala 集合分为可变的和不可变的集合. 可变集合可 ...
- Scala数组| 集合
arrays :+ 5尾部 头部5 +: arrays TODO 声明不可变数组,不能删; 默认情况下,scala中集合的声明全都是不可变的 val arrays: Array[Int] = Ar ...
- scala 可变集合与内存清理的关系
留坑待填 使用scala.collection.mutable._期间,发现了当程序运行内存开销较多时,使用系统工具进行内存清理,然后程序报出了变量找不到.内存无法访问.数组访问越界,堆栈溢出等多种错 ...
- Scala学习——集合的使用和“_”的一些使用(中)
1.空格加_可以表示函数的原型 命令行代码: scala> def fun1(name:String){println(name)} fun1: (name: String)Unit scala ...
- scala中集合的交集、并集、差集
scala中有一些api设计的很人性化,集合的这几个操作是个代表: 交集: scala> Set(1,2,3) & Set(2,4) // &方法等同于interset方法 sc ...
- 用Scala实现集合中相邻元素间的差值
欢迎转载,转载请注明出处,徽沪一郎. 概要 代码这东西,不写肯定不行,新学Scala不久,将实际遇到的一些问题记录下来,日后也好查找. 今天讲的是如何计算同一集合中元素两两之间的差值,即求开始集合(a ...
- 【Scala篇】--Scala中集合数组,list,set,map,元祖
一.前述 Scala在常用的集合的类别有数组,List,Set,Map,元祖. 二.具体实现 数组 1.创建数组 new Array[Int](10) 赋值:arr(0) = xxx Array[ ...
- Scala之集合Collection
概述 Scala的集合类能够从三个维度进行切分: 可变与不可变集合(Immutable and mutable collections) 静态与延迟载入集合 (Eager and delayed ev ...
- [转] Scala 的集合类型与数组操作
[From] https://blog.csdn.net/gongxifacai_believe/article/details/81916659 版权声明:本文为博主原创文章,转载请注明出处. ht ...
随机推荐
- util.Date与sql.Date的异同以及相互转换
Java中有两个Date类 一个是java.util.Date通常情况下用它获取当前时间或构造时间 另一个是java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分 两个类型的时间 ...
- C. 无穷的小数
单点时限: 1.0 sec 内存限制: 512 MB 在十进制下,我们能够很轻易地判断一个小数的位数是有穷的或无穷的,但是把这个小数用二进制表示出的情况下其有穷性和无穷性就会发生改变,比如 十进制下的 ...
- nodejs一些比较实用的命令
在学习node的时候是从express开始的,在express中有一个generate,如果在机器上面全局的安装了express-generate的话,可以直接实用[express project_n ...
- Centos安装docker+vulhub搭建
嫌弃平常因为复现搭建环境所带来的麻烦,所以打算用docker来管理搭建靶机 准备一个纯净的Centos系统虚拟机安装,这里已经安装好了就不演示怎么在虚拟机安装 安装Docker最基本的要求是Linux ...
- [linux] [nginx] 一键安装web环境全攻略phpstudy版,超详细!
找到运行中的服务器(实例). 打开这个主要是看它的IP,是公网ip,公网ip,公网ip,重要的事情说三遍. 接下来我们可以不用在阿里云上操作了,直接用客户端操作,这两个客户端就是Xshell 5和Xf ...
- 最全的 API 接口集合
对于程序员来说,为自己的程序选择一些合适的API并不是那么简单,有时候还会把你搞得够呛,今天猿妹要和大家分享一个开源项目,这个项目汇集了各种开发的api,涵盖了音乐.新闻.书籍.日历等,无论你是从事W ...
- 详解PHP中instanceof关键字及instanceof关键字有什么作用
来源:https://www.jb51.net/article/74409.htm PHP5的另一个新成员是instdnceof关键字.使用这个关键字可以确定一个对象是类的实例.类的子类,还是实现了某 ...
- 2019-2020-1 20199308《Linux内核原理与分析》第三周作业
<Linux内核分析> 第二章 操作系统是如何工作的 2.1 函数调用堆栈 3个关键性的方法机制(3个法宝) 存储程序计算机 函数调用堆栈机制 中断 堆栈相关的寄存器 ESP:堆栈指针(s ...
- 2019-2020-1 20199326《Linux内核原理与分析》第三周作业
第三周学习内容 庖丁解牛Linux内核分析第二章:操作系统是如何工作的 Linux内核分析实验二 学到的一些知识 计算机的三大法宝:存储程序计算机,函数调用堆栈,中断 堆栈是C语言程序运行时必须使用的 ...
- Spring5参考指南: BeanWrapper和PropertyEditor
文章目录 BeanWrapper PropertyEditor BeanWrapper 通常来说一个Bean包含一个默认的无参构造函数,和属性的get,set方法. org.springframewo ...