在Scala中,有两种Map,一个是immutable包下的Map,该Map中的内容不可变;另一个是mutable包下的Map,该Map中的内容可变。
//默认创建不可变map
scala> val scores=Map("zhangsan"->30,"lisi"->80,"wangwu"->70)
scores: scala.collection.immutable.Map[String,Int] = Map(zhangsan -> 30, lisi -> 80, wangwu -> 70)
//利用tuple创建map
scala> val scores=Map(("zhangsan",90),("lisi",80),("wangwu",70))
scores: scala.collection.immutable.Map[String,Int] = Map(zhangsan -> 90, lisi -> 80, wangwu -> 70)
//创建可变map
scala> val scores = scala.collection.mutable.Map(("zhangsan",90),("lisi",80),("wangwu",70))
scores: scala.collection.mutable.Map[String,Int] = Map(lisi -> 80, zhangsan -> 90, wangwu -> 70)
//利用key查询map
scala> scores("zhangsan")
res1: Int = 90
//不存在的key会报错
scala> scores("libai")
java.util.NoSuchElementException: key not found: libai
at scala.collection.MapLike$class.default(MapLike.scala:228)
at scala.collection.AbstractMap.default(Map.scala:59)
at scala.collection.mutable.HashMap.apply(HashMap.scala:65)
... 32 elided
//判断是否包含
scala> scores.contains("libai")
res3: Boolean = false
scala> scores.contains("lisi")
res4: Boolean = true
//get获取的是Some类型
scala> scores.get("lisi")
res5: Option[Int] = Some(80)
scala> scores.get("lisi").get
res6: Int = 80
scala> scores.getOrElse("lisi")
<console>:13: error: not enough arguments for method getOrElse: (key: String, default: => B1)B1.
Unspecified value parameter default.
scores.getOrElse("lisi")
^
//带默认值的查找,推荐这个
scala> scores.getOrElse("lisi",0)
res8: Int = 80
//libai没有,采用默认值
scala> scores.getOrElse("libai",0)
res9: Int = 0
scala> scores
res10: scala.collection.mutable.Map[String,Int] = Map(lisi -> 80, zhangsan -> 90, wangwu -> 70)
//添加元素
scala> scores("lisi")=105
scala> scores
res12: scala.collection.mutable.Map[String,Int] = Map(lisi -> 105, zhangsan -> 90, wangwu -> 70)
//update也可以添加元素
scala> scores.update("lisl",107)
scala> scores
res14: scala.collection.mutable.Map[String,Int] = Map(lisi -> 105, lisl -> 107, zhangsan -> 90, wangwu -> 70)
//也可以修改元素
scala> scores("libai")=99
scala> scores
res16: scala.collection.mutable.Map[String,Int] = Map(libai -> 99, lisi -> 105, lisl -> 107, zhangsan -> 90, wangwu -> 70)
//+=追加元素
scala> scores+=("tom"->77)
res17: scores.type = Map(libai -> 99, lisi -> 105, lisl -> 107, zhangsan -> 90, tom -> 77, wangwu -> 70)
//+=追加多个元素
scala> scores+=("lifei"->87,"jerry"->98)
res18: scores.type = Map(libai -> 99, lisi -> 105, lisl -> 107, zhangsan -> 90, lifei -> 87, tom -> 77, jerry -> 98, wangwu -> 70)
//- 删除元素
scala> scores-"lisi"
res19: scala.collection.mutable.Map[String,Int] = Map(libai -> 99, lisl -> 107, zhangsan -> 90, lifei -> 87, tom -> 77, jerry -> 98, wangwu -> 70)
//--删除元素
scala> scores--List("zhangsan","lifei")
res20: scala.collection.mutable.Map[String,Int] = Map(lisi -> 105, libai -> 99, lisl -> 107, tom -> 77, jerry -> 98, wangwu -> 70)
scala> scores-("lisi","libai")
res21: scala.collection.mutable.Map[String,Int] = Map(lisl -> 107, zhangsan -> 90, lifei -> 87, tom -> 77, jerry -> 98, wangwu -> 70)
//迭代key
scala> val res=scores.keySet
res: scala.collection.Set[String] = Set(libai, lisi, lisl, zhangsan, lifei, tom, jerry, wangwu)
scala> for(ele <-res) print(ele+ " ")
libai lisi lisl zhangsan lifei tom jerry wangwu
//迭代 ,结果为tuple
scala> for(i <- scores) print(i+" ")
(libai,99) (lisi,105) (lisl,107) (zhangsan,90) (lifei,87) (tom,77) (jerry,98) (wangwu,70)
//另一种迭代方式
scala> for ((k,v)<-scores) print(k+" "+v+" ")
libai 99 lisi 105 lisl 107 zhangsan 90 lifei 87 tom 77 jerry 98 wangwu 70
scala> scores
res25: scala.collection.mutable.Map[String,Int] = Map(libai -> 99, lisi -> 105, lisl -> 107, zhangsan -> 90, lifei -> 87, tom -> 77, jerry -> 98, wangwu -> 70)
//put添加元素
scala> scores.put("mm",9)
res26: Option[Int] = None
scala> scores
res27: scala.collection.mutable.Map[String,Int] = Map(libai -> 99, lisi -> 105, lisl -> 107, zhangsan -> 90, lifei -> 87, mm -> 9, tom -> 77, jerry -> 98, wangwu -> 70)
//其他方法
scala> scores.
+ applyOrElse empty getOrElse keysIterator product scanRight to unzip
++ canEqual equals getOrElseUpdate last put seq toArray unzip3
++: clear exists groupBy lastOption reduce size toBuffer update
++= clone filter grouped lift reduceLeft sizeHint toIndexedSeq updated
+= collect filterKeys hasDefiniteSize map reduceLeftOption sizeHintBounded toIterable values
- collectFirst filterNot hashCode mapResult reduceOption slice toIterator valuesIterator
-- companion find head mapValues reduceRight sliding toList view
--= compose flatMap headOption max reduceRightOption span toMap withDefault
-= contains flatten init maxBy remove splitAt toSeq withDefaultValue
/: copyToArray fold inits min repr stringPrefix toSet withFilter
:\ copyToBuffer foldLeft isDefinedAt minBy result sum toStream zip
WithFilter count foldRight isEmpty mkString retain tail toString zipAll
addString default forall isTraversableAgain nonEmpty runWith tails toTraversable zipWithIndex
aggregate drop foreach iterator orElse sameElements take toVector
andThen dropRight genericBuilder keySet par scan takeRight transform
apply dropWhile get keys partition scanLeft takeWhile transpose