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)

首先ArrayList永远是不可变的。

而集Set和影射Map提供了可变和不可变的两种版本。
Scala中集的类型结构UML图:

 

1set

以下默认创建一个不可变集合:

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

 

Scala之元组Set和map集合

 

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

Scala之元组Set和map集合

 

https://www.scala-lang.org/api/2.11.12/#scala.collection.immutable.HashSet

 

1、map集合

MapUML图如下 :

 

 

创建一个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的breakOut的应用

scala 高级十六 scala 集合和集合的高级特性 map flatten fllatmap zip reduce zip 等操作

Scala集合Map

Scala学习(集合01)

Scala学习(集合01)

Scala 高阶:集合内容汇总(上篇)