Scala映射Map是一种可迭代的键值对(key/value)结构。所有的键都是唯一的;所有的值都可以通过键来获取。Map也叫做哈希表Hash Table。Map有两种类型,可变的和不可变的。默认情况下,Scala使用不可变Map,即使用的是scala.collection.immutable.Map包;如果需要使用可变的Map,需要导入scala.collection.mutable.Map包。
1.Map的定义
不可变映射的使用:
object Test1 {
def main(args:Array[String]){
val map1 = Map("one"->1,"two"->2,"three"->3);
println(map1.getClass.getName);
println(map1);
}
}
编译并执行以上代码,输出结果如下:
E:\Scala>scalac Test1.scala
E:\Scala>scala Test1
scala.collection.immutable.Map$Map3
Map(one -> 1, two -> 2, three -> 3)
可变映射的使用:
import scala.collection.mutable.Map;
object Test2{
def main(args:Array[String]){
val colors = Map("red"->"#FF0000","green"->"#00FF00","blue"->"#0000FF");
println(colors.getClass.getName);
println(colors);
colors += ("white"->"#000000");
println(colors);
}
}
编译并执行以上代码,输出结果如下:
E:\Scala>scalac Test2.scala
E:\Scala>scala Test2
scala.collection.mutable.HashMap
Map(green -> #00FF00, red -> #FF0000, blue -> #0000FF)
Map(green -> #00FF00, white -> #000000, red -> #FF0000, blue -> #0000FF)
2.Map基本操作
Scala Map有三个基本操作:
- keys返回Map对象所有的键key
- values返回Map对象所有的值value
- isEmpty在Map对象为空时返回true
以下实例演示了Map三个基本操作的使用:
object Test3{
def main(args:Array[String]){
val colors = Map("red"->"#FF0000","green"->"#00FF00","blue"->"#0000FF");
val empty = Map();
println("colors.keys = "+colors.keys);
println("colors.values = "+colors.values);
println("colors.isEmpty = "+colors.isEmpty);
println("empty.isEmpty = "+empty.isEmpty);
}
}
编译并执行上述代码,输出结果如下:
E:\Scala>scalac Test3.scala
E:\Scala>scala Test3
colors.keys = Set(red, green, blue)
colors.values = MapLike.DefaultValuesIterable(#FF0000, #00FF00, #0000FF)
colors.isEmpty = false
empty.isEmpty = true
3.Map合并操作
使用++运算符或者Map.++()方法可以合并两个Map,Map合并时会移除重复的key:
object Test4 {
def main(args:Array[String]){
val map1 = Map("one"->1,"two"->2,"three"->3);
println(map1);
val map2 = Map("one"->1,"three"->3,"five"->5);
println(map2);
val res1 = map1++map2;
println("map1++map2 = " + res1);
val res2 = map1.++(map2);
println("map1.++(map2) = " + res1);
}
}
编译并执行以上代码,输出结果如下:
E:\Scala>scalac Test4.scala
E:\Scala>scala Test4
Map(one -> 1, two -> 2, three -> 3)
Map(one -> 1, three -> 3, five -> 5)
map1++map2 = Map(one -> 1, two -> 2, three -> 3, five -> 5)
map1.++(map2) = Map(one -> 1, two -> 2, three -> 3, five -> 5)
4.Map输出操作
可以通过foreach循环输出Map的keys和values:
object Test5 {
def main(args:Array[String]){
val colors = Map("red"->"#FF0000","green"->"#00FF00","blue"->"#0000FF");
colors.keys.foreach{ key =>
print("key = " + key)
println(", value = " + colors(key))
}
}
}
编译并执行以上代码,输出结果如下:
E:\Scala>scalac Test5.scala
E:\Scala>scala Test5
key = red, value = #FF0000
key = green, value = #00FF00
key = blue, value = #0000FF
5.Map包含操作
可以使用Map.contains方法来查看Map中是否存在指定的key:
object Test6 {
def main(args:Array[String]){
val colors = Map("red"->"#FF0000","green"->"#00FF00","blue"->"#0000FF");
println(colors);
if(colors.contains("red")){
println("red = " + colors("red"));
}
else{
println("red does not exist");
}
if(colors.contains("black")){
println("black = " + colors("black"));
}
else{
println("black does not exist");
}
}
}
编译并执行上述代码,输出结果如下:
E:\Scala>scalac Test6.scala
E:\Scala>scala Test6
Map(red -> #FF0000, green -> #00FF00, blue -> #0000FF)
red = #FF0000
black does not exist
6.Map常用方法
下面列出了Scala Map类型常用的方法:
def ++(xs: Map[(A, B)]): Map[A, B]
返回一个新的 Map,新的 Map xs 组成
def -(elem1: A, elem2: A, elems: A*): Map[A, B]
返回一个新的 Map, 移除 key 为 elem1, elem2 或其他 elems。
def –(xs: GTO[A]): Map[A, B]
返回一个新的 Map, 移除 xs 对象中对应的 key
def get(key: A): Option[B]
返回指定 key 的值
def iterator: Iterator[(A, B)]
创建新的迭代器,并输出 key/value 对
def addString(b: StringBuilder): StringBuilder
将 Map 中的所有元素附加到StringBuilder,可加入分隔符
def addString(b: StringBuilder, sep: String): StringBuilder
将 Map 中的所有元素附加到StringBuilder,可加入分隔符
def apply(key: A): B
返回指定键的值,如果不存在返回 Map 的默认方法
def clear(): Unit
清空 Map
def clone(): Map[A, B]
从一个 Map 复制到另一个 Map
def contains(key: A): Boolean
如果 Map 中存在指定 key,返回 true,否则返回 false。
def copyToArray(xs: Array[(A, B)]): Unit
复制集合到数组
def count(p: ((A, B)) => Boolean): Int
计算满足指定条件的集合元素数量
def default(key: A): B
定义 Map 的默认值,在 key 不存在时返回。
def drop(n: Int): Map[A, B]
返回丢弃前n个元素新集合
def dropRight(n: Int): Map[A, B]
返回丢弃最后n个元素新集合
def dropWhile(p: ((A, B)) => Boolean): Map[A, B]
从左向右丢弃元素,直到条件p不成立
def empty: Map[A, B]
返回相同类型的空 Map
def equals(that: Any): Boolean
如果两个 Map 相等(key/value 均相等),返回true,否则返回false
def exists(p: ((A, B)) => Boolean): Boolean
判断集合中指定条件的元素是否存在
def filter(p: ((A, B))=> Boolean): Map[A, B]
返回满足指定条件的所有集合
def filterKeys(p: (A) => Boolean): Map[A, B]
返回符合指定条件的不可变 Map
def find(p: ((A, B)) => Boolean): Option[(A, B)]
查找集合中满足指定条件的第一个元素
def foreach(f: ((A, B)) => Unit): Unit
将函数应用到集合的所有元素
def init: Map[A, B]
返回所有元素,除了最后一个
def isEmpty: Boolean
检测 Map 是否为空
def keys: Iterable[A]
返回所有的key/p>
def last: (A, B)
返回最后一个元素
def max: (A, B)
查找最大元素
def min: (A, B)
查找最小元素
def mkString: String
集合所有元素作为字符串显示
def product: (A, B)
返回集合中数字元素的积。
def remove(key: A): Option[B]
移除指定 key
def retain(p: (A, B) => Boolean): Map.this.type
如果符合满足条件的返回 true
def size: Int
返回 Map 元素的个数
def sum: (A, B)
返回集合中所有数字元素之和
def tail: Map[A, B]
返回一个集合中除了第一元素之外的其他元素
def take(n: Int): Map[A, B]
返回前 n 个元素
def takeRight(n: Int): Map[A, B]
返回后 n 个元素
def takeWhile(p: ((A, B)) => Boolean): Map[A, B]
返回满足指定条件的元素
def toArray: Array[(A, B)]
集合转数组
def toBuffer[B >: A]: Buffer[B]
返回缓冲区,包含了 Map 的所有元素
def toList: List[A]
返回 List,包含了 Map 的所有元素
def toSeq: Seq[A]
返回 Seq,包含了 Map 的所有元素
def toSet: Set[A]
返回 Set,包含了 Map 的所有元素
def toString(): String
返回字符串对象