Scala之元组Set和map集合
Posted 健哥说编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala之元组Set和map集合相关的知识,希望对你有一定的参考价值。
7、元组
容器对象元素tuple.
不可变。
元组和List不同,元组可以包含不同类型的数据。
元组类似于JavaBean中的封装,用于封装不同数据类型的数据。
而Scala可以很容易的创建一个这样的对象tuple。
1、实例化和使用元组
定义元组
scala> val pair = ("Jack",35)
pair: (String, Int) = (Jack,35)
访问元素指定下标(类似于,但不是下标)的对象,从1开始:
scala> println(pair._1)
Jack
scala> println(pair._2)
35
2、元组推断
Scala会自己推断元素的具体类型,上面Scala会推断出元组的类型为:Tuple2。目前Scala最多可以支持到Tuple22(书上说的,似乎可以更多,需要验证)。
类似的如下,Scala可以自动的推断出结果为:Tuple6。
scala> val stud = ("Jack",23,"SDJN","wangjian@126.com","100029","186")
stud: (String, Int, String, String, String, String) = (Jack,23,SDJN,wangjian@126
.com,100029,186)
scala> println(stud._5)
100029
3、->操作符号说明
1、->是一个二元操作符号。
2、当调用 1->2时是1做->的方法调用。
3、->将返回一个两元素的元组对象Tuple2。
4、所以,以下方法,将直接创建一个Tuple2的对象
scala> val aa = 1->3
aa: (Int, Int) = (1,3)
scala> val bb = "name"->"Jack"
bb: (String, String) = (name,Jack)
scala> println(bb._1)
name
8、使用集(set)和影射(map)
首先Array和List永远是不可变的。
而集Set和影射Map提供了可变和不可变的两种版本。
Scala中集的类型结构UML图:
1、set集
以下默认创建一个不可变集合:
scala> val set = Set("BB","CC")
set: scala.collection.immutable.Set[String] = Set(BB, CC)
创建一个不可变集合,重复的元素,将不能添加成功
scala> val set = Set("BB","CC","BB")
set: scala.collection.immutable.Set[String] = Set(BB, CC)
Contains方法:
scala> println(set.contains("AA"))
false
scala> println(set.contains("BB"))
True
使用var声明的集合,可以进行添加运算,但必须返回的一个新的集合:
scala> var set=Set("Jack","Mary")
set: scala.collection.immutable.Set[String] = Set(Jack, Mary)
添加Alex对象:
scala> set+="Alex"
查看已经多了Alex
scala> println(set)
Set(Jack, Mary, Alex)
添加Mary由于之前已经存在Mary所以,添加不成功
scala> set=set+"Mary"
set: scala.collection.immutable.Set[String] = Set(Jack, Mary, Alex)
scala> println(set)
Set(Jack, Mary, Alex)
添加Smith成功:
scala> set=set+"Smith"
set: scala.collection.immutable.Set[String] = Set(Jack, Mary, Alex, Smith)
【更多方法可以参考Scala的官方API】
2、可变的set
如果要创建一个可变的Set,需要使用import引用:multable:
scala> import scala.collection.mutable
import scala.collection.mutable
scala> val set2 = mutable.Set("A","B")
set2: scala.collection.mutable.Set[String] = Set(B, A)
scala> set2+="C"
res22: set2.type = Set(B, C, A)
scala> println(set2)
Set(B, C, A)
注意+=可变集合上的一个方法,所以可以写成:
scala> set2.+=("D")
res24: set2.type = Set(B, C, D, A)
scala> println(set2)
Set(B, C, D, A)
3、使用子类HashSet
scala> import scala.collection.immutable.HashSet
import scala.collection.immutable.HashSet
scala> val set = HashSet("Tomatoes","Chilies")
set: scala.collection.immutable.HashSet[String] = Set(Chilies, Tomatoes)
使用+操作,将返回一个新的集合:
scala> set+"Jack"
res20: scala.collection.immutable.HashSet[String] = Set(Chilies, Tomatoes, Jack)
更多API:
https://www.scala-lang.org/api/2.11.12/#scala.collection.immutable.HashSet
1、map集合
Map的UML图如下 :
创建一个Map:
导入一个可变集合
scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map
创建Map集合
scala> var map = Map[String,String]()
map: scala.collection.mutable.Map[String,String] = Map()
注意只有可变的Map集合上才拥有+=方法
scala> map+=("name"->"Jack")
res28: scala.collection.mutable.Map[String,String] = Map(name -> Jack)
再put一些数据
scala> map+=("addr"->"SDJN")
res29: scala.collection.mutable.Map[String,String] = Map(addr -> SDJN, name -> J
ack)
显示Map集合中的所有的数据:
scala> println(map)
Map(addr -> SDJN, name -> Jack)
显示指定key对应的value:
scala> println(map("name"))
Jack
可以使用Any类型保存任意类型的对象
scala> var map = Map[String,Any]()
map: scala.collection.mutable.Map[String,Any] = Map()
scala> map+=("name"->"Jack")
res3: scala.collection.mutable.Map[String,Any] = Map(name -> Jack)
scala> map+=("age"->34)
res4: scala.collection.mutable.Map[String,Any] = Map(age -> 34, name -> Jack)
Map中保存的应该都是Tuple的对象,目前看是样,所以,你可以这样遍历Map:
scala> map.foreach(x=>println(x._1+","+x._2))
age,34
name,Jack
默认情况下,如果没有使用_1则会输出tuple2:
scala> map.foreach(x=>println(x))
(age,34)
(name,Jack)
+=是map的方法,所以,也可以按以下方式调用:
scala> var map = Map[String,Any]()
map: scala.collection.mutable.Map[String,Any] = Map()
scala> map.+=("name"->"Jack")
res0: scala.collection.mutable.Map[String,Any] = Map(name -> Jack)
scala> map.+=("age"->56)
res1: scala.collection.mutable.Map[String,Any] = Map(age -> 56, name -> Jack)
根据api的提示,可以一次添加多个kv值,如以下添加两个:
scala> map+=("addr"->"SDJN","mail"->"wangjian")
res2: mutable.Map[String,Any] = Map(addr -> SDJN, mail -> wangjian)
以下是API说明:
所以,可以使用上面的api的示例,快速创建一个Map对象:
scala> val map =Map("name"->"Jack","age"->23,"addr"->"SDJN")
map: scala.collection.mutable.Map[String,Any] = Map(addr -> SDJN, age -> 23, name -> Jack)
或是创建一个不可变的集合:
scala> var map = scala.collection.immutable.Map("name"->"Jack","age"->33)
map: scala.collection.immutable.Map[String,Any] = Map(name -> Jack, age -> 33)
在IDEA中遍历,可以显示更多的帮助信息:
var map:Map[String,Any] =Map[String,Any]("name"->"Jack","age"->24);
map.foreach(tuple=>{
println(tuple._1+","+tuple._2);
})
---
以上是关于Scala之元组Set和map集合的主要内容,如果未能解决你的问题,请参考以下文章
scala 高级十六 scala 集合和集合的高级特性 map flatten fllatmap zip reduce zip 等操作