// 创建一个不可变的Map
val ages = Map("Leo" -> 30, "Jen" -> 25, "Jack" -> 23)
ages("Leo") = 31
// 创建一个可变的Map
val ages = scala.collection.mutable.Map("Leo" -> 30, "Jen" -> 25, "Jack" -> 23)
ages("Leo") = 31
// 使用另外一种方式定义Map元素
val ages = Map(("Leo", 30), ("Jen", 25), ("Jack", 23))
// 创建一个空的HashMap
val ages = new scala.collection.mutable.HashMap[String, Int]
// 获取指定key对应的value,如果key不存在,会报错
val leoAge = ages("Leo")
val leoAge = ages("leo")
// 使用contains函数检查key是否存在
val leoAge = if (ages.contains("leo")) ages("leo") else 0
// getOrElse函数
val leoAge = ages.getOrElse("leo", 0)
// 更新Map的元素
ages("Leo") = 31
// 增加多个元素
ages += ("Mike" -> 35, "Tom" -> 40)
// 移除元素
ages -= "Mike"
// 更新不可变的map
val ages2 = ages + ("Mike" -> 36, "Tom" -> 40)
// 移除不可变map的元素
val ages3 = ages - "Tom"
// 遍历map的entrySet
for ((key, value) <- ages) println(key + " " + value)
// 遍历map的key
for (key <- ages.keySet) println(key)
// 遍历map的value
for (value <- ages.values) println(value)
// 生成新map,反转key和value
for ((key, value) <- ages) yield (value, key)
// SortedMap可以自动对Map的key的排序
val ages = scala.collection.immutable.SortedMap("leo" -> 30, "alice" -> 15, "jen" -> 25)
// LinkedHashMap可以记住插入entry的顺序
val ages = new scala.collection.mutable.LinkedHashMap[String, Int]
ages("leo") = 30
ages("alice") = 15
ages("jen") = 25
与列表一样,元组也是不可变的,但与列表不同的是元组可以包含不同类型的元素。
元组的值是通过将单个的值包含在圆括号中构成的。例如:
// 简单Tuple
val t = ("leo", 30)
// 访问Tuple
t._1
// zip操作
val names = Array("leo", "jack", "mike")
val ages = Array(30, 24, 26)
val nameAges = names.zip(ages)
for ((name, age) <- nameAges) println(name + ": " + age)
val t = (1, 3.14, "Fred")
object Test {
def main(args: Array[String]) {
val t = (4,3,2,1)
val sum = t._1 + t._2 + t._3 + t._4
println( "元素之和为: " + sum )
}
}
你可以使用 Tuple.productIterator() 方法来迭代输出元组的所有元素:
object Test {
def main(args: Array[String]) {
val t = (4,3,2,1)
t.productIterator.foreach{ i =>println("Value = " + i )}
}
}
你可以使用 Tuple.toString() 方法将元组的所有元素组合成一个字符串,实例如下:
object Test {
def main(args: Array[String]) {
val t = new Tuple3(1, "hello", Console)
println("连接后的字符串为: " + t.toString() )
}
}
你可以使用 Tuple.swap 方法来交换元组的元素。如下实例:
object Test {
def main(args: Array[String]) {
val t = new Tuple2("www.google.com", "www.runoob.com")
println("交换后的元组: " + t.swap )
}
}
小案例(统计多个文本文件的单词总数)
object Tongji {
def main(args: Array[String]): Unit = {
//使用scala的IO包将文本文件的数据读取出来
val line1=scala.io.Source.fromFile("C://Users//zy//Desktop//jinmi.txt").mkString//文件路径
val line2=scala.io.Source.fromFile("C://Users//zy//Desktop//jin.txt").mkString
//使用List的伴生对象,将多个文件内的内容创建一个List
val lines =List(line1,line2)
//读取出来应该是一个List比如List("gfhdf gh yut dgfh","et6 fegf fds dfsa")
lines.flatMap(_.split(" ")).map((_,1)).map(_._2).reduceLeft(_+_)
//将List按照空格切割就会形成一个新的list比如:list(gfhd hfkj asdh hdgk sdbhk 766 hfk)
//.map((_,1))意思就是形成一个个Tuple格式比如(sghd,1)(gdfhj,1)
//.map(_._2)意思就是将前面的Tuple中后面的元素提取出来比如形成(1)(1)(1)
//reduceLeft(_+_)意思就是从左边加起,第一个1加上第二个1之后再与第三个相加依次类推
}
}
//zip操作,是Array类的方法,用于将两个Array合并为一个Array
// 比如Array(v1)和Array(v2),使用zip操作合并后的格式为Array(v1,v2)
//合并后的Array的元素类型为Tuple
val students =Array("leo","jack","jen")
val scores=Array(80,100,90)
val studentScores= students.zip(scores)
for ((student,score) <- studentScores)
println(student+"\t"+score)
//如果Array的元素类型是个Tuple,调用Array的toMap方法,可以将Array转换为Map
studentScores.toMap
//Java Map 与Scala Map的隐式转换
//java to scala
import scala.collection.JavaConversions.mapAsScalaMap
val javaScores =new util.HashMap[String,Int]()
javaScores.put("Alice",10)
javaScores.put("Bob",3)
javaScores.put("Cindy",8)
val scalaScores:scala.collection.mutable.Map[String,Int]=javaScores
//scala to java
import scala.collection.JavaConversions.mapAsJavaMap
import java.awt.font.TextAttribute._
val scalaAttrMap =Map(FAMILY -> "Serif",SIZE ->12)
val fONT =new Font(scalaAttrMap)