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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容