scala-03Tuple、Array、Map
Map映射
映射和和元组,也就是Maps和Tuples。Map这东西应该都挺明白的,就是键值对的集合。在Scala中,Map是对偶(算是键值对的另一个说法吧)的集合。->操作符用来创建对偶,"Alice" -> 10产出 ("Alice", 10),即key和values。
1、更改对偶:
(1)可变的Map,更改某个已有的值,或者是添加一个没有的对偶:
scores("scala") = 7
(2)添加多个对偶,使用“+=”操作符:
Score+=(“hadoop”->3,”spark”->5, ...)
(3)移除某个对偶,使用“-=”操作符:
Score-=“hadoop”
(4)不可变的Map来说,操作基本都会是返回一个新的Map:
// 获取一个添加了新对偶的Map
val newScores = scores + ("Bob" -> 10, "Fred" -> 7)
// 获取一个移除了对偶的Map
val newScores = scores - "Alice"
2、获取Map中的值
val bobsScore = scores("scala")
若Map中没有包含这个键值对,会抛出一个异常。用 contains()方法来检查是否包含指定的键。
val bobsScore=if(scores.contains(“scala”))scores(“scala”)else 0
或:val bobsScore = scores.getOrElse("Bob", 0)
3、迭代map
for ((k, v) <- map)
for (k <- map.keySet) // 单独拿出键
for (v <- map.values) // 单独拿出值
元组tuple(不可变)
在Scala中,元组是n个对象的一个聚集(Map是n=2个对象的聚集),元组可以包含不同类型的元素。
1,元组也是不可变的,但是元组可以是不同类型的数据
2,实例化:var a = (,)
3,可以通过点号,下划线,-N(N从1开始)的索引访问元素
def main(args:Array[String]):Unit{ //访问组元
val triple=(100,”scala”,”hadoop”) //类型为tuple3[int,sting,string]
Println(triple._1) //triple._1,2,3方法,从1开始
Println(triple._2)
Println(triple._3)
}
// 通常是使用模式匹配来获取组元的
val (first, second, third) = t
// 如果说不是所有的组元都需要,那么在不需要的地方放上_
val (first, second, _) = t
val array=Array(1,2,3,4,5)
for(i<-0 until array.length){
Println(array(i))
}
以上程序等价于:
for(elem<-array){
Println(elem)
}
List列表(不可变)
1,类型都是相同的
2,不可变的,(Array虽然长度固定,但是元素之使可变的)
3,(:::)实现叠加List,(::)cons:将新元素组合到列表的最前端
val list1= 1 :: 2 :: 3 :: 4 :: Nil
Println(list1)
Val list2= 2:: 4 :: 5 :: 6 :: Nil
Println(list2)
Val list3=list1 ::: list2
Println(list3)
//返回list3为:list(2,4,5,6,1,2,3,4)
带类型的参数化数组Array(可变亦可不变)
val greetStrings= new Array[String](3) |
其中Array[String]变量greetStrings的类型,3为实例初始化参数。
Scala里的数组是通过把索引放在圆括号里面访问的,而不是像Java那样放在方括号里。所以数组的第零个元素是greetStrings(0),不是greetStrings[0]。
Scala如何看待val的意义的重要概念。当你用val定义一个变量,那么这个变量就不能重新赋值,但它指向的对象却仍可以暗自改变。所以在本例中,你不能把greetStrings重新赋值成不同的数组;greetStrings将永远指向那个它被初始化时候指向的同一个Array[String]实例。但是你能一遍遍修改那个Array[String]的元素,因此数组本身是可变的。