4.3 Scala集合:Map

Map是一个key-value 对的集合。在其它语言中,它被称为词典、关联数组、或HashMap。这是一个根据key查找value的高效的数据结构。

下面的代码段演示了怎样创建和使用一个Map:

val capitals = Map("美国" -> "华盛顿", "英国" -> "伦敦","中国" -> "北京")
val chinaCapital = capitals("中国")
println(chinaCapital)

下面这个示例是对Map进行迭代。

val booksMap = Map(101 -> "Scala", 102 -> "Spark")

val iterator = booksMap.keySet.iterator
while (iterator.hasNext) {
  var key = iterator.next
  // println(s"图书Id:$key,图书名称:${booksMap.get(key)}")
  println(s"图书Id:$key,图书名称:${booksMap(key)}")
}

输出如下所示:

图书Id:101,图书名称:Scala
图书Id:102,图书名称:Spark

【示例】创建使用不可变Map的示例。

object MapDemo {
def main(args: Array[String]): Unit = {
  println("1: 初始化一个带有3个元素的Map - 使用key/value元组")
  // val map1: Map[String, String] = Map(("PG","苹果"),("XG","西瓜"),("PTG","葡萄干"))
  val map1 = Map(("PG","苹果"),("XG","西瓜"),("PTG","葡萄干")) // 类型推断
  println(s"map1的元素 = $map1")

  println("\n2: 使用key->value表示法初始化Map")
  // val map2: Map[String, String] = Map("PG" -> "苹果", "XG" -> "西瓜", "PTG" -> "葡萄干")
  val map2 = Map("PG" -> "苹果", "XG" -> "西瓜", "PTG" -> "葡萄干")
  println(s"map2的元素 = $map2")

  println("\n3: 通过特定键访问元素")
  println(s"Key是PG的元素 = ${map2("PG")}")
  println(s"Key是XG的元素 = ${map2("XG")}")
  println(s"Key是PTG的元素 = ${map2("PTG")}")
  println(s"Key是HLG的元素 = ${map2.get("HLG")}")     // 访问不存在的key
  println(s"Key是HLG的元素 = ${map2.getOrElse("HLG","火龙果")}")

  println("\n4: 使用 + 添加元素")
  // val map3: Map[String, String] = map1 + ("HLG" -> "火龙果")
  val map3: Map[String, String] = map1 + ("PTG" -> "火龙果") // 也可用来修改元素值
  println(s"map3 = $map3")

  println("\n5: 使用 ++ 将两个Map 添加到一起")
  val map4: Map[String, String] = map3 ++ map2
  println(s"map4 = $map4")

  println("\n6: 使用 - 从Map 删除key及其value")
  val map5: Map[String, String] = map4 - "PG"
  println(s"Map移除了PG key及其value = $map5")

  println("\n7: 初始化一个空的Map")
  val emptyMap: Map[String,String] = Map.empty[String,String]
  println(s"Empty Map = $emptyMap")
}
}

【示例】如何遍历一个Map集合。

object Test {
def main(args: Array[String]): Unit = {

  // map的遍历
  val map = Map(("aa",1),("bb",2),("cc",5),("dd",3))

  map.foreach { t =>
    val (x, y) = t
    println(s"key=$x, value=$y")
  }

  map.foreach { t =>
    println(s"k=${t._1}, v=${t._2}")
  }

  for(item <- map){
    val (x, y) = item
    println(s"key=$x,value=$y")
  }

  for((k,v) <- map){
    println(s"k = $k, v = $v")
  }

  for(key <- map.keySet){
    println(s"key=$key,value=${map(key)}")
  }

  for(item <- map){
    println(item)
  }

  for(item <- map){
    println(s"key=${item._1}, value=${item._2}")
  }

  for(v <- map.values){
    println(s"value=$v")
  }
}
}

下面的代码示例演示的Map的创建和操作:

// 创建
var m1 = Map(("zhang3" -> 20), ("li4" -> 23), ("wang5" -> 21))
var m2 = Map(("zhang3", 20), ("li4", 23), ("wang5", 21))   // 也可使用元组创建

var m = scala.collection.mutable.Map(("zhang3", 20), ("li4", 23), ("wang5", 21))
// var m3 = scala.collection.mutable.Map[String, Int]()   // 定义空 map,要用可变的才有意义。

// 添加和更新:+= ++=
m += (("zhao6", 22))
m ++= Map(("a" -> 1), ("b" -> 2))
m

// updated,没有增加,有了替换
m = m.updated("zheng7", 19) // 和上面方法一样
m

m.put("wu", 22)
m

// 删除
m -= ("zhang3")     // 删除一个元素:按指定的key删除

m.clear()   // 清空
m

/* -- 查询 -- */
println("---------查询-------------")
var m4 = Map(("zhang3", 20), ("li4", 23), ("wang5", 21))
m4("zhang3")
// m4("aaa")     // 会出错,不友好
m4.get("aaa")   // 友好方式,推荐
m4.getOrElse("aaa",23)
m4.getOrElse("zhang3",23)

/* -- 遍历 -- */
var m5 = Map(("zhang3", 20), ("li4", 23), ("wang5", 21))

// 方法 1:直接打印 entry
for (entry <- m5) {
  println(entry)
}

println("-------------")
// 方法 2:直接打印 key,顺手输出 value
for (key <- m5.keySet) {
  println(key + ":" + m5(key))
}

println("-------------")
for((k,v) <- m5){
  println(k + "," + v)
}

println("-------------")
// 方法 3.foreach
m5.foreach(e => {
  val (k, v) = e
  println(k + "," + v)
})

println("-------------")
// 方法 4
m5.foreach(e => println(e._1 + "," + e._2))

【示例】不可变的HashMap示例。

import scala.collection.immutable.HashMap

object HashMapDemo {
def main(args: Array[String]): Unit = {
  println("1: 初始化一个带有3个元素的HashMap - 使用key/value元组")
  // val hashMap1: HashMap[String, String] = HashMap(("PG","苹果"),("XG","西瓜"),("PTG","葡萄干"))
  val hashMap1 = HashMap(("PG","苹果"),("XG","西瓜"),("PTG","葡萄干")) // 类型推断
  println(s"hashMap1的元素 = $hashMap1")

  println("\n2: 使用key->value表示法初始化Map")
  // val hashMap2: HashMap[String, String] = HashMap("PG" -> "苹果", "XG" -> "西瓜", "PTG" -> "葡萄干")
  val hashMap2 = HashMap("PG" -> "苹果", "XG" -> "西瓜", "PTG" -> "葡萄干")
  println(s"hashMap2的元素 = $hashMap2")

  println("\n3: 通过特定键访问元素")
  println(s"Key是PG的元素 = ${hashMap2("PG")}")
  println(s"Key是XG的元素 = ${hashMap2("XG")}")
  println(s"Key是PTG的元素 = ${hashMap2("PTG")}")
  println(s"Key是HLG的元素 = ${hashMap2.get("HLG")}")     // 访问不存在的key
  println(s"Key是HLG的元素 = ${hashMap2.getOrElse("HLG","火龙果")}")

  println("\n4: 使用 + 添加元素")
  // val hashMap3: HashMap[String, String] = hashMap1 + ("HLG" -> "火龙果")
  val hashMap3: HashMap[String, String] = hashMap1 + ("PTG" -> "火龙果") // 也可用来修改元素值
  println(s"hashMap3 = $hashMap3")

  println("\n5: 使用 ++ 将两个Map 添加到一起")
  val hashMap4: Map[String, String] = hashMap3 ++ hashMap2
  println(s"map4 = $hashMap4")

  println("\n6: 使用 - 从Map 删除key及其value")
  val hashMap5: Map[String, String] = hashMap4 - "PG"
  println(s"HashMap移除了PG key及其value = $hashMap5")

  println("\n7: 初始化一个空的Map")
  val emptyMap: HashMap[String,String] = HashMap.empty[String,String]
  println(s"Empty HashMap = $emptyMap")
}
}

【示例】不可变的TreeMap示例。

import scala.collection.immutable.TreeMap

object TreeMapDemo {
def main(args: Array[String]): Unit = {
    println("1: 初始化一个带有3个元素的HashMap - 使用key/value元组")
    // val treeMap1: TreeMap[String, String] = TreeMap(("PG","苹果"),("XG","西瓜"),("PTG","葡萄干"))
    val treeMap1 = TreeMap(("PG","苹果"),("XG","西瓜"),("PTG","葡萄干")) // 类型推断
    println(s"hashMap1的元素 = $treeMap1")

    println("\n2: 使用key->value表示法初始化Map")
    // val treeMap2: TreeMap[String, String] = TreeMap("PG" -> "苹果", "XG" -> "西瓜", "PTG" -> "葡萄干")
    val treeMap2 = TreeMap("PG" -> "苹果", "XG" -> "西瓜", "PTG" -> "葡萄干")
    println(s"hashMap2的元素 = $treeMap2")

    println("\n3: 通过特定键访问元素")
    println(s"Key是PG的元素 = ${treeMap2("PG")}")
    println(s"Key是XG的元素 = ${treeMap2("XG")}")
    println(s"Key是PTG的元素 = ${treeMap2("PTG")}")
    println(s"Key是HLG的元素 = ${treeMap2.get("HLG")}")     // 访问不存在的key
    println(s"Key是HLG的元素 = ${treeMap2.getOrElse("HLG","火龙果")}")

    println("\n4: 使用 + 添加元素")
    // val treeMap3: TreeMap[String, String] = hashMap1 + ("HLG" -> "火龙果")
    val treeMap3: TreeMap[String, String] = treeMap1 + ("PTG" -> "火龙果") // 也可用来修改元素值
    println(s"treeMap3 = $treeMap3")

    println("\n5: 使用 ++ 将两个TreeMap 添加到一起")
    val treeMap4: TreeMap[String, String] = treeMap3 ++ treeMap2
    println(s"treeMap4 = $treeMap4")

    println("\n6: 使用 - 从TreeMap 删除key及其value")
    val treeMap5: TreeMap[String, String] = treeMap4 - "PG"
    println(s"TreeMap移除了PG key及其value = $treeMap5")

    println("\n7: 将TreeMap的顺序改为降序")
    object AlphabetOrdering extends Ordering[String] {
        def compare(key1:String, key2:String): Int = key2.compareTo(key1)
    }
    val treeMap6: TreeMap[String, String] = TreeMap(
        ("PG","苹果"),
        ("XG","西瓜"),
        ("PTG","葡萄干")
    )(AlphabetOrdering)
    println(s"treeMap6的元素按降序排列 = $treeMap6")

    println("\n8: 初始化一个空的TreeMap")
    val mptyTreeMap: TreeMap[String,String] = TreeMap.empty[String,String]
    println(s"Empty TreeMap = $mptyTreeMap")
}
}

【示例】不可变的ListMap示例。

import scala.collection.immutable.ListMap

object ListMapDemo {
def main(args: Array[String]): Unit = {
println("1: 初始化一个ListMap")
val listMap1: ListMap[String, String] = ListMap(
"PG" -> "苹果",
"XG" -> "西瓜",
"PTG" -> "葡萄干"
)
println(s"listMap1的元素 = $listMap1")

println("\n2: 通过ListMap中的特定键访问元素")
println(s"key PG对应的元素 = ${listMap1("PG")}")
println(s"key XG对应的元素 = ${listMap1("XG")}")
println(s"key PTG对应的元素 = ${listMap1("PTG")}")

println("\n3: ListMap是一个递归数据结构")
println(s"head of ListMap = ${listMap1.head}") // 返回一个元组
println(s"tail of ListMap = ${listMap1.tail}")

println("\n4: 使用 + 向ListMap添加元素")
// val listMap2: ListMap[String, String] = listMap1 + ("KD" -> "Krispy Kreme Donut")
val listMap2 = listMap1 + ("HLG" -> "火龙果")
println(s"listMap2的元素 = $listMap2")

println("\n5: 使用 ++ 添加两个ListMap到一起")
val listMap3: ListMap[String, String] = listMap1 ++ listMap2
println(s"listMap3的元素 = $listMap3")

println("\n6: 使用 - 从ListMap中删除key和value")
val listMap4: ListMap[String, String] = listMap1 - "PG"
println(s"没有PG及其值的ListMap = $listMap4")

println("\n7: 初始化一个空的ListMap")
val emptyListMap: ListMap[String, String] = ListMap.empty[String,String]
println(s"key和value都是String类型的空ListMap = $emptyListMap")
}
}
 
© 版权声明
THE END
喜欢就支持一下吧
点赞246赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

夸夸
夸夸
还有吗!没看够!
取消
昵称表情代码图片

    暂无评论内容