1 数组
scala中数组的概念是和Java类似,可以用数组来存放一组数据。scala中,有两种数组,一种是定长数组,另一种是变长数组
1.1 定长数组
- 定长数组指的是数组的长度是不允许改变的
- 数组的元素是可以改变的
语法
// 通过指定长度定义数组 val/var 变量名 = new Array[元素类型](数组长度) // 用元素直接初始化数组 val/var 变量名 = Array(元素1, 元素2, 元素3...)
[!NOTE]
- 在scala中,数组的泛型使用
[]
来指定- 使用
()
来获取元素
示例一
- 定义一个长度为100的整型数组
- 设置第1个元素为110
- 打印第1个元素
参考代码
scala> val a = new Array[Int](100) a: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) scala> a(0) = 110 scala> println(a(0)) 110
示例二
- 定义一个包含以下元素的数组
"java", "scala", "python"
- 获取数组长度
参考代码
// 定义包含jave、scala、python三个元素的数组 scala> val a = Array("java", "scala", "python") a: Array[String] = Array(java, scala, python) scala> a.length res17: Int = 3
2 变长数组
变长数组指的是数组的长度是可变的,可以往数组中添加、删除元素
2.1 定义变长数组
创建变长数组,需要提前导入ArrayBuffer类import scala.collection.mutable.ArrayBuffer
语法
- 创建空的ArrayBuffer变长数组,语法结构:
val/var a = ArrayBuffer[元素类型]()
创建带有初始元素的ArrayBuffer
val/var a = ArrayBuffer(元素1,元素2,元素3....)
示例一
定义一个长度为0的整型变长数组
参考代码
val a = ArrayBuffer[Int]()
示例二
定义一个包含以下元素的变长数组
"hadoop", "storm", "spark"
参考代码
scala> val a = ArrayBuffer("hadoop", "storm", "spark") a: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(hadoop, storm, spark)
2.2 添加/修改/删除元素
- 使用
+=
添加元素 - 使用
-=
删除元素 - 使用
++=
追加一个数组到变长数组
示例
- 定义一个变长数组,包含以下元素: “hadoop”, “spark”, “flink”
- 往该变长数组添加一个"flume"元素
- 从该变长数组删除"hadoop"元素
- 再将一个数组,该数组包含"hive", "sqoop"追加到变长数组中
参考代码
// 定义变长数组 scala> val a = ArrayBuffer("hadoop", "spark", "flink") a: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(hadoop, spark, flink) // 追加一个元素 scala> a += "flume" res10: a.type = ArrayBuffer(hadoop, spark, flink, flume) // 删除一个元素 scala> a -= "hadoop" res11: a.type = ArrayBuffer(spark, flink, flume) // 追加一个数组 scala> a ++= Array("hive", "sqoop") res12: a.type = ArrayBuffer(spark, flink, flume, hive, sqoop)
3 遍历数组
可以使用以下两种方式来遍历数组:
- 使用
for表达式
直接遍历数组中的元素 - 使用
索引
遍历数组中的元素
示例一
- 定义一个数组,包含以下元素1,2,3,4,5
- 使用for表达式直接遍历,并打印数组的元素
参考代码
scala> val a = Array(1,2,3,4,5) a: Array[Int] = Array(1, 2, 3, 4, 5) scala> for(i<-a) println(i) 1 2 3 4 5
示例二
- 定义一个数组,包含以下元素1,2,3,4,5
- 使用for表达式基于索引下标遍历,并打印数组的元素
参考代码
scala> val a = Array(1,2,3,4,5) a: Array[Int] = Array(1, 2, 3, 4, 5) scala> for(i <- 0 to a.length - 1) println(a(i)) 1 2 3 4 5 scala> for(i <- 0 until a.length) println(a(i)) 1 2 3 4 5
[!NOTE]
0 until n——生成一系列的数字,包含0,不包含n
0 to n ——包含0,也包含n
4 数组常用算法
scala中的数组封装了一些常用的计算操作,将来在对数据处理的时候,不需要我们自己再重新实现。以下为常用的几个算法:
- 求和——sum方法
- 求最大值——max方法
- 求最小值——min方法
- 排序——sorted方法
4.1 求和
数组中的sum
方法可以将所有的元素进行累加,然后得到结果
示例
- 定义一个数组,包含以下几个元素(1,2,3,4)
- 请计算该数组的和
参考代码
scala> val a = Array(1,2,3,4) a: Array[Int] = Array(1, 2, 3, 4) scala> a.sum res49: Int = 10
4.2 最大值
数组中的max
方法,可以获取到数组中的最大的那个元素值
示例
- 定义一个数组,包含以下几个元素(4,1,2,4,10)
- 获取数组的最大值
参考代码
scala> val a = Array(4,1,2,4,10) a: Array[Int] = Array(4, 1, 2, 4, 10) scala> a.max res50: Int = 10
4.3 最小值
数组的min
方法,可以获取到数组中最小的那个元素值
示例
- 定义一个数组,包含以下几个元素(4,1,2,4,10)
- 获取数组的最小值
参考代码
scala> val a = Array(4,1,2,4,10) a: Array[Int] = Array(4, 1, 2, 4, 10) scala> a.min res51: Int = 1
4.4 排序
数组的sorted
方法,可以对数组进行升序排序。而reverse
方法,可以将数组进行反转,从而实现降序排序
示例
- 定义一个数组,包含以下几个元素(4,1,2,4,10)
- 对数组进行升序排序、降序排序
参考代码
// 升序排序 scala> a.sorted res53: Array[Int] = Array(1, 2, 4, 4, 10) // 降序 scala> a.sorted.reverse res56: Array[Int] = Array(10, 4, 4, 2, 1)
5 元组
元组可以用来包含一组不同类型的值。例如:姓名,年龄,性别,出生年月。元组的元素是不可变的。
5.1 定义元组
语法
使用括号来定义元组
val/var 元组 = (元素1, 元素2, 元素3....)
使用箭头来定义元组(元组只有两个元素)
val/var 元组 = 元素1->元素2
示例
定义一个元组,包含一个学生的以下数据
id | 姓名 | 年龄 | 地址 |
1 | zhangsan | 20 | beijing |
参考代码
scala> val a = (1, "zhangsan", 20, "beijing") a: (Int, String, Int, String) = (1,zhangsan,20,beijing)
示例
- 定义一个元组,包含学生的姓名和年龄(zhangsan、20)
- 分别使用括号、和箭头来定义元组
参考代码
scala> val a = ("zhangsan", 20) a: (String, Int) = (zhangsan,20) scala> val a = "zhangsan" -> 20 a: (String, Int) = (zhangsan,20)
5.2 访问元组
使用_1、_2、_3…来访问元组中的元素,_1表示访问第一个元素,依次类推
示例
- 定义一个元组,包含一个学生的姓名和性别,“zhangsan”, “male”
- 分别获取该学生的姓名和性别
参考代码
scala> val a = "zhangsan" -> "male" a: (String, String) = (zhangsan,male) // 获取第一个元素 scala> a._1 res41: String = zhangsan // 获取第二个元素 scala> a._2 res42: String = male