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 |