Scala学习笔记04_Map与Tuple

守給你的承諾、 提交于 2020-03-08 17:51:44

创建Map

 1// 创建一个不可变的Map
 2scala> val ages = Map("Leo" -> 30, "Jen" -> 25, "Jack" -> 23)
 3scala> val ages = Map("Leo" -> 30, "Jen" -> 25, "Jack" -> 23)
 4ages: scala.collection.immutable.Map[String,Int] = Map(Leo -> 30, Jen -> 25, Jack -> 23)
 5scala> ages("Leo") = 31
 6<console>:15: error: value update is not a member of scala.collection.immutable.Map[String,Int]
 7       ages("Leo") = 31
 8       ^
 9// 创建一个可变的Map
10scala> val ages = scala.collection.mutable.Map("Leo" -> 30, "Jen" -> 25, "Jack" -> 23)
11ages: scala.collection.mutable.Map[String,Int] = Map(Jen -> 25, Jack -> 23, Leo -> 30)
12scala> ages("Leo") = 31
13scala> ages("Leo")
14res43: Int = 31
15scala> ages
16res44: scala.collection.mutable.Map[String,Int] = Map(Jen -> 25, Jack -> 23, Leo -> 31)
17// 使用另外一种方式定义Map元素
18scala> val ages = Map(("Leo",30), ("Jen",25), ("Jack",23))
19ages: scala.collection.immutable.Map[String,Int] = Map(Leo -> 30, Jen -> 25, Jack -> 23)
20// 创建一个空的HashMap
21scala> val ages = new scala.collection.mutable.HashMap[String,Int]
22ages: scala.collection.mutable.HashMap[String,Int] = Map()
23scala> val ages = new scala.collection.mutable.HashMap[String,Int]()
24ages: scala.collection.mutable.HashMap[String,Int] = Map()
25scala> val ages = new scala.collection.mutable.Map[String,Int]()
26<console>:13: error: trait Map is abstract; cannot be instantiated
27       val ages = new scala.collection.mutable.Map[String,Int]()
28                  ^

访问Map的元素

 1// 获取指定key对应的value,如果key不存在,会报错
 2scala> val ages = scala.collection.mutable.Map("Leo" -> 30, "Jen" -> 25, "Jack" -> 23)
 3ages: scala.collection.mutable.Map[String,Int] = Map(Jen -> 25, Jack -> 23, Leo -> 30)
 4scala> val leoAge = ages("Leo")
 5leoAge: Int = 30
 6scala> val leoAge = ages("leo")
 7java.util.NoSuchElementException: key not found: leo
 8  at scala.collection.MapLike$class.default(MapLike.scala:228)
 9  at scala.collection.AbstractMap.default(Map.scala:59)
10  at scala.collection.mutable.HashMap.apply(HashMap.scala:65)
11  ... 32 elided
12// 使用contains函数检查key是否存在
13scala> val leoAge = if(ages.contains("leo")) ages("leo") else 0
14leoAge: Int = 0
15// getOrElse函数
16scala> val leoAge = ages.getOrElse("leo",0)
17leoAge: Int = 0

修改Map的元素

 1// 更新Map的元素
 2scala> ages
 3res45: scala.collection.mutable.Map[String,Int] = Map(Jen -> 25, Jack -> 23, Leo -> 30)
 4scala> ages("Leo") = 31
 5scala> ages
 6res47: scala.collection.mutable.Map[String,Int] = Map(Jen -> 25, Jack -> 23, Leo -> 31)
 7// 增加多个元素
 8scala> ages += ("Mike" -> 35, "Tom" -> 50)
 9res48: ages.type = Map(Jen -> 25, Mike -> 35, Tom -> 50, Jack -> 23, Leo -> 31)
10// 移除元素
11scala> ages -= "Mike"
12res49: ages.type = Map(Jen -> 25, Tom -> 50, Jack -> 23, Leo -> 31)
13// 创建不可变的Map
14scala> val ages = Map("Leo" -> 30, "Jack" -> 40, "Jen" -> 25)
15ages: scala.collection.immutable.Map[String,Int] = Map(Leo -> 30, Jack -> 40, Jen -> 25)
16// 更新不可变的Map
17scala> val ages2 = ages + ("Mike" -> 36, "Tom" -> 60)
18ages2: scala.collection.immutable.Map[String,Int] = Map(Mike -> 36, Tom -> 60, Leo -> 30, Jack -> 40, Jen -> 25)
19// 原来Map已有的元素也可更新
20scala> val ages2 = ages + ("Leo" -> 31)
21ages2: scala.collection.immutable.Map[String,Int] = Map(Leo -> 31, Jack -> 40, Jen -> 25)
22// 移除不可变Map的元素
23scala> val ages3 = ages - "Jack"
24ages3: scala.collection.immutable.Map[String,Int] = Map(Leo -> 30, Jen -> 25)

遍历Map

 1// 遍历Map的entrySet
 2scala> ages
 3res50: scala.collection.immutable.Map[String,Int] = Map(Leo -> 30, Jack -> 40, Jen -> 25)
 4scala> for((key,value) <- ages) println(key + ": " + value)
 5Leo: 30
 6Jack: 40
 7Jen: 25
 8// 遍历Map的key
 9scala> for(key <- ages.keySet) println(key)
10Leo
11Jack
12Jen
13// 遍历Map的Value
14scala> for(value <- ages.values) println(value)
1530
1640
1725
18// 生成新Map,反转key和value
19scala> for((key, value) <- ages) yield (value, key)
20res54: scala.collection.immutable.Map[Int,String] = Map(30 -> Leo, 40 -> Jack, 25 -> Jen)

SortedMap和LinkedHashMap

 1// SortedMap可以自动对Map的key的排序
 2scala> val ages = scala.collection.immutable.SortedMap("Leo" -> 30, "Jack" -> 20, "Jen" ->25)
 3ages: scala.collection.immutable.SortedMap[String,Int] = Map(Jack -> 20, Jen -> 25, Leo -> 30)
 4// LinkedHashMap可以记住插入entry的顺序
 5scala> val ages = new scala.collection.mutable.LinkedHashMap[String, Int]
 6ages: scala.collection.mutable.LinkedHashMap[String,Int] = Map()
 7scala> ages("leo") = 30
 8scala> ages("jack") = 20
 9scala> ages("jen") = 25
10scala> ages
11res3: scala.collection.mutable.LinkedHashMap[String,Int] = Map(leo -> 30, jack -> 20, jen -> 25)

Map的元素类型Tuple

 1// 简单Tuple
 2scala> val t = ("leo", 30)
 3t: (String, Int) = (leo,30)
 4// 访问Tuple
 5scala> t._1
 6res4: String = leo
 7scala> t._2
 8res5: Int = 30
 9// zip操作
10scala> val names = Array("leo", "jack", "jen")
11names: Array[String] = Array(leo, jack, jen)
12scala> val ages = Array(30, 20, 25)
13ages: Array[Int] = Array(30, 20, 25)
14scala> val nameAges = names.zip(ages)
15nameAges: Array[(String, Int)] = Array((leo,30), (jack,20), (jen,25))
16scala> for((name, age) <- nameAges) println(name + ": " + age)
17leo: 30
18jack: 20
19jen: 25

本文首发于steem,感谢阅读,转载请注明。

https://steemit.com/@padluo


微信公众号「padluo」,分享数据科学家的自我修养,既然遇见,不如一起成长。


读者交流电报群

https://t.me/sspadluo


知识星球交流群

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!