一起学scala--Map&Tuple

Map(映射)是一种可迭代的键值对集合。在scala中使用映射非常简单。

构造Map

//inmutable Map(不可变映射,值不可变)
// 具有初始值
// 在scala中->操作符是用来创建键值对元组的。
val inmutableMap = Map(("yoleen" -> 20), ("hq", 26))
// 不具有初始值,不建议对不可变Map这样构建。不可变映射添加数据都返回一个新的映射。
val stringToInt = new scala.collection.immutable.HashMap[String, Int]
//mutable Map(可变映射,增加、删除、更新元素返回自身)
val mutableMap: mutable.Map[String, Int] = scala.collection.mutable.Map(("yoleen" -> 20), ("hq", 26))
//不具有初始值
val stringToInt = new scala.collection.mutable.HashMap[String, Int]
//有初始值的可以不用new

获取映射中的值

val mutableMap: mutable.Map[String, Int] = scala.collection.mutable.Map(("yoleen" -> 20), ("hq", 26))
val v: Option[Int] = mutableMap.get("yoleen") //如果key存在返回的是some对象,对结果进行了封装。不存在返回的是None
val v1: Int = mutableMap("yoleen")// 使用apply方法获取值,不进行option封装。
val v2: Int = mutableMap.getOrElse("yoleen", 10)//如果key不存在就返回默认值
val v3: Int = mutableMap.getOrElseUpdate("yoleen1",op(5,6))//如果key不存在返回默认值的同时还添加进映射中去。

添加&更新映射中的值

val mutableMap: mutable.Map[String, Int] = scala.collection.mutable.HashMap[String,Int]
    mutableMap+=("yoleen"->10)
    mutableMap+=("yoletpig"->10,"alex"->20) //添加多个键值对
    mutableMap++=mutable.Map(("tony" -> 20), ("jskon", 26)) //添加另一个映射中所有键值对。
    mutableMap.put("kudu",6)//键存在则更新值
    mutableMap("yoleen") = 20//更新值
    mutableMap.transform((s, i) => i * 2)//对每个键对应的值进行*2操作

移除键值对

mutableMap-="yoleen" 
mutableMap-=("yoletpig","jskon") //移除多个键值对
val option: Option[Int] = mutableMap.remove("kudu") //移除键值对返回option对象
mutableMap.retain((s,i)=>s.startsWith("y") && i>=10) //只保留键已"y"开头并且值大于等于10的键值对
mutableMap.clear()//清除所有键值对

迭代映射

for (elem <- mutableMap) {
 elem // tuple类型(String,Int)
}
for ((k,v) <- mutableMap) {
  //k,v 键跟值
}
for (elem <- mutableMap.keySet) {
  //elem 就是key  
}
for (elem <- mutableMap.values) {
  //elem 就是value
}

其他映射

除了常用的HashMap之外,还有SortMap,LinkedHashMap,TreeMap等等。

  • SortMap 按照顺序依次访问映射中的键。
  • LinkedHashMap 按照插入顺序访问。
  • TreeMap 按键排序。
    如需与java互操作,加入隐式转换就行。
import scala.collection.JavaConversions.mapAsScalaMap

元组(Tuple)

元组的值是通过将单个的值包含在()中构成。例如:

(1,3.14,"hello") //类型不限
val t = (1,3.14,"hello")
//我们可以通过._1 ._2来访问元组中的元素
val a = t._1 // 1
val b = t._2 // 3.14
//注意,元组下标是从1开始。
//我们可以使用模式匹配获取元组中的值。
val (first,_,third) = t
// first=1,third="hello"

元组的拉链操作

val sy = Array("<","-",">")
val cnt = Array(2,3,2)
val pairs = sy.zip(cnt) //Array(("<",2),("-",3),(">",2))
for((s,n)<-pairs) print(s*n) // <<--->>

码字不易,喜欢的麻烦点下推荐。