1.1. 数组1.1.1. 定长数组和变长数组
(1)定长数组定义格式:
val arr=new Array[T](数组长度)
(2)变长数组定义格式:
val arr = ArrayBuffer[T]()
注意需要导包:import scala.collection.mutable.ArrayBuffer
[AppleScript] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package cn.itcast.scala
import scala.collection.mutable.ArrayBuffer
object ArrayDemo {
def main ( args : Array[String] ) {
/ / 初始化一个长度为 8 的定长数组,其所有元素均为 0
val arr 1 = new Array[Int] ( 8 )
/ / 直接打印定长数组,内容为数组的hashcode值
println ( arr 1 )
/ / 将数组转换成数组缓冲,就可以看到原数组中的内容了
/ / toBuffer会将数组转换长数组缓冲
println ( arr 1. toBuffer )
/ / 注意:如果 new ,相当于调用了数组的apply方法,直接为数组赋值
/ / 初始化一个长度为 1 的定长数组
val arr 2 = Array[Int] ( 10 )
println ( arr 2. toBuffer )
/ / 定义一个长度为 3 的定长数组
val arr 3 = Array ( "hadoop" , "storm" , "spark" )
/ / 使用 ( ) 来访问元素
println ( arr 3 ( 2 ) )
/ / 变长数组(数组缓冲)
/ / 如果想使用数组缓冲,需要导入import scala.collection.mutable.ArrayBuffer包
val ab = ArrayBuffer[Int] ( )
/ / 向数组缓冲的尾部追加一个元素
/ / + = 尾部追加元素
ab + = 1
/ / 追加多个元素
ab + = ( 2 , 3 , 4 , 5 )
/ / 追加一个数组 + + =
ab + + = Array ( 6 , 7 )
/ / 追加一个数组缓冲
ab + + = ArrayBuffer ( 8 , 9 )
/ / 打印数组缓冲ab
/ / 在数组某个位置插入元素用insert,从某下标插入
ab.insert ( 0 , -1 , 0 )
/ / 删除数组某个位置的元素用 remove 按照下标删除
ab. remove ( 0 )
println ( ab )
}
}
|
|
1.1.2. 遍历数组
1.增强for循环
2.好用的until会生成脚标,0 until 10 包含0不包含10

[AppleScript] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
package cn.itcast.scala
object ForArrayDemo {
def main ( args : Array[String] ) {
/ / 初始化一个数组
val arr = Array ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 )
/ / 增强 for 循环
for ( i < - arr )
println ( i )
/ / 好用的until会生成一个Range
/ / reverse 是将前面生成的Range反转
for ( i < - ( 0 until arr.length ) . reverse )
println ( arr ( i ) )
}
}
|
|
1.1.3. 数组转换
yield关键字将原始的数组进行转换会产生一个新的数组,原始的数组不变

[AppleScript] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
package cn.itcast.scala
object ArrayYieldDemo {
def main ( args : Array[String] ) {
/ / 定义一个数组
val arr = Array ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )
/ / 将偶数取出乘以 10 后再生成一个新的数组
val res = for ( e < - arr if e % 2 = = 0 ) yield e * 10
println ( res.toBuffer )
/ / 更高级的写法 , 用着更爽
/ / filter是过滤,接收一个返回值为 boolean 的函数
/ / map相当于将数组中的每一个元素取出来,应用传进去的函数
val r = arr.filter ( _ % 2 = = 0 ) .map ( _ * 10 )
println ( r.toBuffer )
}
}
|
|
1.1.4. 数组常用算法
在Scala中,数组上的某些方法对数组进行相应的操作非常方便!

1.2. 映射
在Scala中,把哈希表这种数据结构叫做映射。
1.2.1. 构建映射
(1)构建映射格式
1、val map=Map(键 -> 值,键 -> 值....)
2、利用元组构建 val map=Map((键,值),(键,值),(键,值)....)

1.2.2. 获取和修改映射中的值
(1)获取映射中的值:
值=map(键)

好用的getOrElse

注意:在Scala中,有两种Map,一个是immutable包下的Map,该Map中的内容不可变;另一个是mutable包下的Map,该Map中的内容可变
例子:

注意:通常我们在创建一个集合是会用val这个关键字修饰一个变量(相当于java中的final),那么就意味着该变量的引用不可变,该引用中的内容是不是可变,取决于这个引用指向的集合的类型
1.3. 元组
映射是K/V对偶的集合,对偶是元组的最简单形式,元组可以装着多个不同类型的值。
1.3.1. 创建元组
(1)元组是不同类型的值的聚集;对偶是最简单的元组。
(2)元组表示通过将不同的值用小括号括起来,即表示元组。
创建元组格式:
val tuple=(元素,元素...)

1.3.2. 获取元组中的值
(1) 获取元组中的值格式:
使用下划线加脚标 ,例如 t._1 t._2 t._3
注意:元组中的元素脚标是从1开始的

1.3.3. 将对偶的集合转换成映射
将对偶的集合转换成映射:
调用其toMap 方法

1.3.4. 拉链操作
1.使用zip命令可以将多个值绑定在一起

注意:如果两个数组的元素个数不一致,拉链操作后生成的数组的长度为较小的那个数组的元素个数
2.如果其中一个元素的个数比较少,可以使用zipAll用默认的元素填充

1.4. 集合
Scala的集合有三大类:序列Seq、Set、映射Map,所有的集合都扩展自Iterable特质,在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable类型的集合初始化后就不能改变了(注意与val修饰的变量进行区别)。
1.4.1. List
(1)不可变的序列 import scala.collection.immutable._
在Scala中列表要么为空(Nil表示空列表) 要么是一个head元素加上一个tail列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))
list常用的操作符:
+: (elem: A): List[A] 在列表的头部添加一个元素
:: (x: A): List[A] 在列表的头部添加一个元素
:+ (elem: A): List[A] 在列表的尾部添加一个元素
++[B](that: GenTraversableOnce[B]): List[B] 从列表的尾部添加另外一个列表
::: (prefix: List[A]): List[A] 在列表的头部添加另外一个列表
val left = List(1,2,3)
val right = List(4,5,6)
//以下操作等价
left ++ right // List(1,2,3,4,5,6)
right.:::(left) // List(1,2,3,4,5,6)
//以下操作等价
0 +: left //List(0,1,2,3)
left.+:(0) //List(0,1,2,3)
//以下操作等价
left :+ 4 //List(1,2,3,4)
left.:+(4) //List(1,2,3,4)
//以下操作等价
0 :: left //List(0,1,2,3)
left.::(0) //List(0,1,2,3)
例子:
[AppleScript] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
package cn.itcast.collect
/ * *
* 不可变List集合操作
* /
object ImmutListDemo {
def main ( args : Array[String] ) {
/ / 创建一个不可变的集合
val lst 1 = List ( 1 , 2 , 3 )
/ / 补充:另一种定义 list 方法
val other_lst = 2 : : Nil
/ / 获取集合的第一个元素
val first = lst 1. head
/ / 获取集合中除第一个元素外的其他元素集合 ,
val tail = lst 1. tail
/ / 补充:其中如果 List 中只有一个元素,那么它的 head 就是这个元素,它的 tail 就是 Nil;
println ( other_lst.head + "----" + other_lst.tail )
/ / 将 0 插入到lst 1 的前面生成一个新的List
val lst 2 = 0 : : lst 1
val lst 3 = lst 1. : : ( 0 )
val lst 4 = 0 + : lst 1
val lst 5 = lst 1. + : ( 0 )
/ / 将一个元素添加到lst 1 的后面产生一个新的集合
val lst 6 = lst 1 : + 3
val lst 0 = List ( 4 , 5 , 6 )
/ / 将 2 个 list 合并成一个新的List
val lst 7 = lst 1 + + lst 0
/ / 将lst 0 插入到lst 1 前面生成一个新的集合
val lst 8 = lst 1 + + : lst 0
/ / 将lst 0 插入到lst 1 前面生成一个新的集合
val lst 9 = lst 1. : : : ( lst 0 )
println ( other_lst )
println ( lst 1 )
println ( first )
println ( tail )
println ( lst 2 )
println ( lst 3 )
println ( lst 4 )
println ( lst 5 )
println ( lst 6 )
println ( lst 7 )
println ( lst 8 )
println ( lst 9 )
}
}
|
(2)可变的序列 import scala.collection.mutable._
[AppleScript] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
ackage cn.itcast.collect
import scala.collection.mutable.ListBuffer
object MutListDemo extends App {
/ / 构建一个可变列表,初始有 3 个元素 1 , 2 , 3
val lst 0 = ListBuffer[Int] ( 1 , 2 , 3 )
/ / 创建一个空的可变列表
val lst 1 = new ListBuffer[Int]
/ / 向lst 1 中追加元素,注意:没有生成新的集合
lst 1 + = 4
lst 1. append ( 5 )
/ / 将lst 1 中的元素最近到lst 0 中, 注意:没有生成新的集合
lst 0 + + = lst 1
/ / 将lst 0 和lst 1 合并成一个新的ListBuffer 注意:生成了一个集合
val lst 2 = lst 0 + + lst 1
/ / 将元素追加到lst 0 的后面生成一个新的集合
val lst 3 = lst 0 : + 5
/ / 删除元素 , 注意:没有生成新的集合
val lst 4 = ListBuffer[Int] ( 1 , 2 , 3 , 4 , 5 )
lst 4 - = 5
/ / 删除一个集合列表 , 生成了一个新的集合
val lst 5 = lst 4 --List(1,2)
/ / 把可变 list 转换成不可变的 list 直接加上toList
val lst 6 = lst 5. toList
/ / 把可变 list 转变数组用toArray
val lst 7 = lst 5. toArray
println ( lst 0 )
println ( lst 1 )
println ( lst 2 )
println ( lst 3 )
println ( lst 4 )
println ( lst 5 )
println ( lst 6 )
println ( lst 7 )
}
|
1.4.2. Set
(1)不可变的Set import scala.collection.immutable._
Set代表一个没有重复元素的集合;将重复元素加入Set是没有用的,而且 Set 是不保证插入顺序的,即 Set 中的元素是乱序的。
定义:val set=Set(元素,元素,.....)
[AppleScript] 纯文本查看 复制代码
?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
/ / 定义一个不可变的Set集合
scala > val set = Set ( 1 , 2 , 3 , 4 , 5 , 6 , 7 )
set : scala.collection.immutable.Set[Int] = Set ( 5 , 1 , 6 , 2 , 7 , 3 , 4 )
/ / 元素个数
scala > set .size
res 0 : Int = 7
/ / 取集合最小值
scala > set .min
res 1 : Int = 1
/ / 取集合最大值
scala > set .max
res 2 : Int = 7
/ / 将元素和set 1 合并生成一个新的 set ,原有 set 不变
scala > set + 8
res 3 : scala.collection.immutable.Set[Int] = Set ( 5 , 1 , 6 , 2 , 7 , 3 , 8 , 4 )
scala > val set 1 = Set ( 7 , 8 , 9 )
set 1 : scala.collection.immutable.Set[Int] = Set ( 7 , 8 , 9 )
/ / 两个集合的交集
scala > set & set 1
res 4 : scala.collection.immutable.Set[Int] = Set ( 7 )
/ / 两个集合的并集
scala > set + + set 1
res 5 : scala.collection.immutable.Set[Int] = Set ( 5 , 1 , 6 , 9 , 2 , 7 , 3 , 8 , 4 )
/ / 在第一个 set 基础上去掉第二个 set 中存在的元素
scala > set -- set1
res 6 : scala.collection.immutable.Set[Int] = Set ( 5 , 1 , 6 , 2 , 3 , 4 )
/ / 返回第一个不同于第二个 set 的元素集合
scala > set & ~ set 1
res 7 : scala.collection.immutable.Set[Int] = Set ( 5 , 1 , 6 , 2 , 3 , 4 )
/ / 计算符合条件的元素个数
scala > set .count ( _ > 5 )
res 8 : Int = 2
/ 返回第一个不同于第二个的元素集合
scala > set .diff ( set 1 )
res 9 : scala.collection.immutable.Set[Int] = Set ( 5 , 1 , 6 , 2 , 3 , 4 )
/ 返回第一个不同于第二个的元素集合
scala > set 1. diff ( set )
res 10 : scala.collection.immutable.Set[Int] = Set ( 8 , 9 )
/ / 取子 set ( 2 , 5 为元素位置 , 从 0 开始,包含头不包含尾 )
scala > set .slice ( 2 , 5 )
res 11 : scala.collection.immutable.Set[Int] = Set ( 6 , 2 , 7 )
/ / 迭代所有的子 set ,取指定的个数组合
scala > set 1. subsets ( 2 ) .foreach ( x = > println ( x ) )
Set ( 7 , 8 )
Set ( 7 , 9 )
Set ( 8 , 9 )
|
|
(2)可变的Set import scala.collection.mutable._
[AppleScript] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
/ / 导入包
scala > import scala.collection.mutable
import scala.collection.mutable
/ / 定义一个可变的Set
scala > val set 1 = new HashSet[Int] ( )
set 1 : scala.collection.mutable.HashSet[Int] = Set ( )
/ / 添加元素
scala > set 1 + = 1
res 1 : set 1. type = Set ( 1 )
/ / 添加元素 add 等价于 + =
scala > set 1. add ( 2 )
res 2 : Boolean = true
scala > set 1
res 3 : scala.collection.mutable.HashSet[Int] = Set ( 1 , 2 )
/ / 向集合中添加元素集合
scala > set 1 + + = Set ( 1 , 4 , 5 )
res 5 : set 1. type = Set ( 1 , 5 , 2 , 4 )
/ / 删除一个元素
scala > set 1 - = 5
res 6 : set 1. type = Set ( 1 , 2 , 4 )
/ / 删除一个元素
scala > set 1. remove ( 1 )
res 7 : Boolean = true
scala > set 1
res 8 : scala.collection.mutable.HashSet[Int] = Set ( 2 , 4 )
|
|
1.4.3. Map
(1)不可变的Map import scala.collection.immutable._
[AppleScript] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
定义Map集合
1. val map = Map ( 键 - > 值 , 键 - > 值... )
2. 利用元组构建 val map = Map ( ( 键,值 ) , ( 键,值 ) , ( 键,值 ) .... )
展现形式:
val map = Map ( “zhangsan” - > 30 , ”lisi” - > 40 )
val map = Map ( ( “zhangsan” , 30 ) , ( “lisi” , 40 ) )
3. 操作map集合
获取值: 值 = map ( 键 )
原则:通过先获取键,在获取键对应值。
4. 遍历map集合
scala > val imap = Map ( "zhangsan" - > 20 , "lisi" - > 30 )
imap : scala.collection.immutable.Map[String , Int] = Map ( zhangsan - > 20 , lisi - > 30 )
/ / 方法一:显示所有的 key
scala > imap.keys
res 0 : Iterable[String] = Set ( zhangsan , lisi )
/ / 方法二:显示所有的 key
scala > imap.keySet
res 1 : scala.collection.immutable.Set[String] = Set ( zhangsan , lisi )
/ / 通过 key 获取 value
scala > imap ( "lisi" )
res 2 : Int = 30
/ / 通过 key 获取 value 有 key 对应的值则返回,没有就返回默认值 0 ,
scala > imap.getOrElse ( "zhangsan" , 0 )
res 4 : Int = 20
/ / 没有对应的 key ,返回默认 0
scala > imap.getOrElse ( "zhangsan1" , 0 )
res 5 : Int = 0
/ / 由于是不可变map , 故不能向其添加、删除、修改键值对
|
|
(2)可变的Map import scala.collection.mutable._
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/ / 导包
import scala.collection.mutable
/ / 声明一个可变集合
scala > val user = mutable.HashMap ( "zhangsan" - > 50 , "lisi" - > 100 )
user : scala.collection.mutable.HashMap[String , Int] = Map ( lisi - > 100 , zhangsan - > 50 )
/ / 添加键值对
scala > user + = ( "wangwu" - > 30 )
res 0 : user.type = Map ( lisi - > 100 , zhangsan - > 50 , wangwu - > 30 )
/ / 添加多个键值对
scala > user + = ( "zhangsan0" - > 30 , "lisi0" - > 20 )
res 1 : user.type = Map ( zhangsan 0 - > 30 , lisi - > 100 , zhangsan - > 50 , lisi 0 - > 20 , wangwu - > 30 )
/ / 方法一:显示所有的 key
scala > user.keys
res 2 : Iterable[String] = Set ( zhangsan 0 , lisi , zhangsan , lisi 0 , wangwu )
/ / 方法二:显示所有的 key
scala > user.keySet
res 3 : scala.collection.Set[String] = Set ( zhangsan 0 , lisi , zhangsan , lisi 0 , wangwu )
/ / 通过 key 获取 value
scala > user ( "zhangsan" )
res 4 : Int = 50
/ / 通过 key 获取 value 有 key 对应的值则返回,没有就返回默认值 0 ,
scala > user.getOrElse ( "zhangsan" , 0 )
res 5 : Int = 50
/ / 没有对应的 key ,返回默认 0
scala > user.getOrElse ( "zhangsan1" , 0 )
res 6 : Int = 0
/ / 更新键值对
scala > user ( "zhangsan" ) = 55
scala > user ( "zhangsan" )
res 8 : Int = 55
/ / 更新多个键值对
scala > user + = ( "zhangsan" - > 60 , "lisi" - > 50 )
res 9 : user.type = Map ( zhangsan 0 - > 30 , lisi - > 50 , zhangsan - > 60 , lisi 0 - > 20 , wangwu - > 30 )
/ / 删除 key
scala > user - = ( "zhangsan" )
res 14 : user.type = Map ( zhangsan 0 - > 30 , lisi - > 50 , lisi 0 - > 20 , wangwu - > 30 )
/ / 删除 key
scala > user. remove ( "zhangsan0" )
/ / 遍历map 方法一:通过 key 值
scala > for ( x < - user.keys ) println ( x + " -> " + user ( x ) )
lisi - > 50
lisi 0 - > 20
wangwu - > 30
/ / 遍历map 方法二:模式匹配
scala > for ( ( x , y ) < - user ) println ( x + " -> " + y )
lisi - > 50
lisi 0 - > 20
wangwu - > 30
/ / 遍历map 方法三:通过foreach
scala > user.foreach { case ( x , y ) = > println ( x + " -> " + y ) }
lisi - > 50
lisi 0 - > 20
wangwu - > 30
|