关闭

[Scala]Scala学习笔记三 Map与Tuple

标签: scala映射元组MapTuple
386人阅读 评论(0) 收藏 举报
分类:

1. 构造映射

可以使用如下命令构造一个映射:

scala> val scores = Map("Alice" -> 90, "Kim" -> 89, "Bob"-> 98)
scores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 90, Kim -> 89, Bob -> 98)

上面构造了一个不可变的Map[String, Int],其值也不能被改变.如果想要一个可变映射,使用如下命令创建:

scala> val scores = scala.collection.mutable.Map("Alice" -> 90, "Kim" -> 89, "Bob"-> 98)
scores: scala.collection.mutable.Map[String,Int] = Map(Bob -> 98, Alice -> 90, Kim -> 89)

如果只想创建一个空的映射:

scala> val scores = new scala.collection.mutable.HashMap[String, Int]
scores: scala.collection.mutable.HashMap[String,Int] = Map()

从上面我们可以知道使用->操作符来创建映射的键值对元素

"Alice" -> 90

我们也可以使用下面的方式定义映射:

scala> val scores = Map(("Alice",90), ("Kim",89), ("Bob",98))
scores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 90, Kim -> 89, Bob -> 98)

2. 获取映射中的值

可以使用()来查找某个键对应的值:

scala> val bobscores = scores("Bob")
bobscores: Int = 98

如果映射中并不包含对应键的值,则会跑出异常,这与Java返回null不同:

scala> val tomScores = scores("Tom")
java.util.NoSuchElementException: key not found: Tom
  at scala.collection.MapLike$class.default(MapLike.scala:228)
  at scala.collection.AbstractMap.default(Map.scala:59)
  at scala.collection.MapLike$class.apply(MapLike.scala:141)
  at scala.collection.AbstractMap.apply(Map.scala:59)
  ... 32 elided

所以在获取某个键对应的值之前,要先检查映射中是否存在指定的键:

scala> val tomScores = if(scores.contains("Tom")) scores("Tom") else 0
tomScores: Int = 0

以下是一个快捷写法:

scala> val tomScores = scores.getOrElse("Tom", 0)
tomScores: Int = 0

3. 更新映射中的值

在可变映射中,可以更新某个映射的值,也可以添加一个新的键值对:

scala> val scores = scala.collection.mutable.Map("Alice" -> 90, "Kim" -> 89, "Bob"-> 98)
scores: scala.collection.mutable.Map[String,Int] = Map(Bob -> 98, Alice -> 90, Kim -> 89)
scala> scores("Alice")=100 // 更新键值对
scala> scores("Tom")=67 // 添加键值对
scala> println(scores)
Map(Bob -> 98, Tom -> 67, Alice -> 100, Kim -> 89)

还可以使用+=操作符来添加多个关系:

scala> scores += ("Bob" -> 78, "Fred" -> 89)
res3: scores.type = Map(Bob -> 78, Fred -> 89, Tom -> 67, Alice -> 100, Kim -> 89)

还可以使用-=操作符移除某个键对应的值:

scala> scores -= "Tom"
res4: scores.type = Map(Bob -> 78, Fred -> 89, Alice -> 100, Kim -> 89)

虽然不可以更新一个不可变的映射,但是我们利用一些操作产生一个新的映射,并可以对原映射中的键值对进行修改或者添加新的键值对:

scala> val scores = Map("Alice" -> 90, "Kim" -> 89, "Bob"-> 98)
scores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 90, Kim -> 89, Bob -> 98)

scala> val newScores = scores + ("Kim" -> 78, "Tom" -> 54)
newScores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 90, Kim -> 78, Bob -> 98, Tom -> 54)

上例中scores是不可变映射,我们在它基础上对"Kim"进行了修改,添加了"Tom",产生了一个新的映射newScores

4. 迭代映射

可以使用如下命令迭代映射:

scala> for( key <- scores.keySet ) println(key + "---" + scores(key))
Alice---90
Kim---89
Bob---98

或者

scala> for( value <- scores.values ) println(value)
90
89
98

5. 排序映射

在操作映射时,我们需要选定一个映射(哈希表还是平衡树).默认情况下,scala给的是哈希表.有时候我们想对键进行一个排序,顺序访问键,这就需要一个树形映射:

scala> val scores = scala.collection.immutable.SortedMap("Alice" -> 90, "Kim" -> 89, "Bob"-> 98)
scores: scala.collection.immutable.SortedMap[String,Int] = Map(Alice -> 90, Bob -> 98, Kim -> 89)

6. 与Java互操作

如果你有一个Java映射,想要转换为Scala映射,以便便捷的使用Scala映射的方法,只需要增加如下语句:

import scala.collection.JavaConversions.mapAsScalaMap

然后指定Scala映射类型来出发转换:

scala> val scores : scala.collection.mutable.Map[String,Int] = new java.util.TreeMap[String, Int]
scores: scala.collection.mutable.Map[String,Int] = Map()

还可以将java.util.Properties到Map[String, String]的转换:

scala> import scala.collection.JavaConversions.propertiesAsScalaMap
import scala.collection.JavaConversions.propertiesAsScalaMap

scala> val props : scala.collection.Map[String, String] = System.getProperties()
props: scala.collection.Map[String,String] =
Map(env.emacs -> "", java.runtime.name -> Java(TM) SE Runtime Environment, sun.boot.library.path -> /home/xiaosi/opt/jdk-1.8.0/jre/lib/amd64, java.vm.version -> 25.91-b14, java.vm.vendor -> Oracle Corporation, ...

相反,如果想要把Scal映射转换为Java映射,只需要提供相反的隐式转换即可:

scala> import scala.collection.JavaConversions.mapAsJavaMap
import scala.collection.JavaConversions.mapAsJavaMap

scala> import java.awt.font.TextAttribute._ // 引入下面的映射会用到的键
import java.awt.font.TextAttribute._

scala> val attrs = Map(FAMILY -> "Serif", SIZE -> 12) // Scala映射
attrs: scala.collection.immutable.Map[java.awt.font.TextAttribute,Any] = Map(java.awt.font.TextAttribute(family) -> Serif, java.awt.font.TextAttribute(size) -> 12)

scala> val font = new java.awt.Font(attrs) // Java映射
font: java.awt.Font = java.awt.Font[family=Serif,name=Serif,style=plain,size=12]

7. 元组Tuple

元组是不同类型的值的聚合,元组的值通过将单个的值包含在圆括号中构成的:

scala> val bobScore = (1, 98.5, "Bob")
bobScore: (Int, Double, String) = (1,98.5,Bob)

可以使用方法_1_2_3访问其组员:

scala> val bobScore = (1, 98.5, "Bob")
bobScore: (Int, Double, String) = (1,98.5,Bob)

scala> bobScore._1
res10: Int = 1

scala> bobScore._3
res11: String = Bob

通常,使用模式匹配的方式来获取元组的组元:

scala> val (id, score, name) = bobScore // 将变量id赋值为1,变量score赋值为98.5,变量name赋值为Bob
   val bobScore: (Int, Double, String)

scala> val (id, score, name) = bobScore
id: Int = 1
score: Double = 98.5
name: String = Bob

scala> println("name = " + name + ", score = " + score + ", name = " + name)
name = Bob, score = 98.5, name = Bob
1
0
查看评论

scala Map 和 Tuple操作

package com.sparktest /** * 1.默认情况下Map构造的是不可变的集合,里面的内容不可变,一旦修改就变成了新的Map,原有的Map内容保持不变 * 2.Map的实例是调用工厂模式的apply来构造Map实例,而需要主要的是Map的接口,在apply中使用了具体的实...
  • u013063153
  • u013063153
  • 2016-12-02 18:56
  • 788

Scala学习笔记--Array和List和Tuple和Set和Map

Array(可变的同类对象序列) Scala里面使用new实例化对象,实例化过程中,可以用值和类型使对象参数化(parameterize) 参数化的意思是:在创建实例的同事完成对它的”设置”。使用值参数化实例通过把值传递给构造器的 圆括号来实现。 scala&...
  • snail_gesture
  • snail_gesture
  • 2015-11-04 21:07
  • 973

scala 之 Map ,Tuple 以及 Zip 操作

package com.scalaxuexi // 在这一讲我们将分享 Map ,Tuple 以及 Zip 操作 //Map 本身是映射,在生活中应用也非常广泛 //Tuple 也是scala中非常重要的数据结构,我们使用tuple可以把很多类型不一样的元素组成一个集合 //Zip 把两个集...
  • minglihu
  • minglihu
  • 2016-12-20 17:27
  • 220

Scala中的Map和Tuple

1、默认情况下Map构造的是不可变的集合,里面的内容不可修改,一旦修改就变成新的Map,原有的Map内容保持不变; 2、Map的实例是调用工厂方法模式apply来构造Map实例,而需要主要的是Map是接口,在apply中使用了具体的实现; 3、如果想直接new出Map实例,则需要使用HashMa...
  • u012297062
  • u012297062
  • 2016-08-22 18:17
  • 1499

scala编程笔记(2)List-Tuple-set-map

使用类型参数化数组 先来段代码: //val greeting:Array[String] = new Array[String](3) val greeting = new Array[String](3) greeting(0) = "hello" gree...
  • luyee2010
  • luyee2010
  • 2014-04-17 01:08
  • 4610

Scala基础语法、函数及Array、Map、Tuple

1.Scala基础语法 2.Scala中函数 3,Scala中的Array、Map、Tuple Scala基础
  • sinat_25306771
  • sinat_25306771
  • 2016-05-20 00:46
  • 3006

Scala之Array,List,Tuple,Set,Map

package com.scala.study /** * Created by Administrator on 2016/8/8. */ object Test { def max(x:Int,y:Int):Int={ if(x>y) x ...
  • fjse51
  • fjse51
  • 2016-08-09 13:51
  • 1038

Scala光速入门之Scala的基本语法、Array、Map、Tuple等

首先很高兴能成为王老师3000门徒之一,在新年第一天第一课《Scala光速入门》就长达三个小时,在这三个小时的时间里面,整体上感觉难度不是很大,但由于前期没有准备Scala环境,仅仅听导致效率很低,导致中间大半个小时基本上收获比较低,今天上午我把Scala环境搭建完毕,也把spark源码下载下来,后...
  • panyuwu
  • panyuwu
  • 2016-01-02 17:10
  • 2200

scala使用zip合并两个集合为二元组集合

tuple只能有tuple2到tuple22 Problem     你想要合并两个有序集合成为一个键值对集合 Solution     使用zip方法合并两个集合: scala> ...
  • qq_36330643
  • qq_36330643
  • 2017-08-01 09:17
  • 674

Scala的Tuple拉链操作、Java Map与Scala Map的隐式转换

Tuple拉链操作指的就是zip操作 zip操作,是Array类的方法,用于将两个Array,合并为一个Array 比如Array(v1)和Array(v2),使用zip操作合并后的格式为Array((v1,v2)) 合并后的Array的元素类型为Tuple val students =...
  • qq_39532946
  • qq_39532946
  • 2017-08-31 15:23
  • 294
    个人资料
    • 访问:1517581次
    • 积分:22609
    • 等级:
    • 排名:第378名
    • 原创:624篇
    • 转载:133篇
    • 译文:60篇
    • 评论:189条
    博客专栏
    文章分类
    最新评论