Scala编程基础19:Scala映射

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
返回字符串对象

你可能感兴趣的:(Scala编程基础19:Scala映射)