Scala 编程—第三节:数组 Array

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HG_Harvey/article/details/82225535

Scala 语言中提供的数组是用来存储固定大小的同类型元素,数组对于每一门编辑应语言来说都是重要的数据结构之一。
数组的第一个元素索引为0,最后一个元素的索引为元素总数减1。

1.定长数组

// 定义一个长度为10的数值数组
scala> val numArr = new Array[Int](10)
numArr: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

// 定义一个长度为10的String类型数组
scala> val stringArr = new Array[String](10)
stringArr: Array[String] = Array(null, null, null, null, null, null, null, null, null, null)

// 可以看出:复杂对象类型在数组定义时被初始化为null,数值型被初始化为0

// 需要注意的是,stringArr 数组使用 val修饰,意味着stringArr不能被改变,但数组内容是可以改变的
scala> stringArr(0) = "first"
scala> stringArr
res14: Array[String] = Array(first, null, null, null, null, null, null, null, null, null)

// 直接打印定长数组,内容为数组的hashcode值
scala> println(numArr)
[I@2f39b534

scala> println(stringArr)
[Ljava.lang.String;@19d9ba89

// 数组转换成数组缓冲,就可以看到原数组中的内容了,使用toBuffer转换
scala> println(numArr.toBuffer)
ArrayBuffer(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

scala> println(stringArr.toBuffer)
ArrayBuffer(First, Second)

// 另一种定长数组定义方式,这种调用方式其实是调用其apply方法进行数组创建操作
scala> val strArr = Array("Java", "Scala")
strArr: Array[String] = Array(Java, Scala)
// 访问数组元素使用(),下标从0开始
scala> val strArr = Array("Java", "Scala")
strArr: Array[String] = Array(Java, Scala)
scala> println(strArr(0))
Java

2.变长数组 ArrayBuffer

// 要使用ArrayBuffer,先要引入scala.collection.mutable.ArrayBuffer
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

// 创建String类型ArrayBuffer数组缓冲
scala> val strArray = ArrayBuffer[String]()
strArray: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer()

// +=意思是在尾部添加元素
scala> strArray += "Java"
res20: strArray.type = ArrayBuffer(Java)

// +=后面还可以跟多个元素的集合
scala> strArray += ("Scala", "Python")
res21: strArray.type = ArrayBuffer(Java, Scala, Python)

scala> strArray
res22: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(Java, Scala, Python)

// ++=用于向数组中追加内容,++=右侧可以是任何集合
// 追加Array数组
scala> strArray ++= Array("PHP", "JavaScript", "IOS")
res23: strArray.type = ArrayBuffer(Java, Scala, Python, PHP, JavaScript, IOS)

scala> strArray ++= List("Ruby", "C++")
res24: strArray.type = ArrayBuffer(Java, Scala, Python, PHP, JavaScript, IOS, Ruby, C++)

// 删除末尾n个元素
scala> strArray.trimEnd(3)

scala> strArray
res26: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(Java, Scala, Python, PHP, JavaScript)

// 创建整型数组缓冲
scala> var intArr = ArrayBuffer(1, 2, 3)
intArr: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

//在数组索引为0的位置插入元素4
scala> intArr.insert(0, 4)

scala> intArr
res29: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(4, 1, 2, 3)

// 在数组索引为0的位置插入元素5, 6, 7
scala> intArr.insert(0, 5, 6, 7)

scala> intArr
res31: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(5, 6, 7, 4, 1, 2, 3)

// 从索引0开始,删除4个元素
scala> intArr.remove(0, 4)

scala> intArr
res34: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

//转成定长数组
scala> intArr.toArray
res35: Array[Int] = Array(1, 2, 3)

// 将定长数组转成ArrayBuffer
scala> intArr.toBuffer
res36: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3)

3.遍历数组

scala> val intArr = Array(1, 2, 3, 4, 5)
intArr: Array[Int] = Array(1, 2, 3, 4, 5)

// to
scala> for(i <- 0 to intArr.length - 1) println("i = " + intArr(i))
i = 1
i = 2
i = 3
i = 4
i = 5

// until 
scala> for(i <- 0 until intArr.length) println("i = " + intArr(i))
i = 1
i = 2
i = 3
i = 4
i = 5

// 推荐使用
scala> for(i <- intArr) println("i = " + i)
i = 1
i = 2
i = 3
i = 4
i = 5

// 步长为2
scala> for(i <- 0 until (intArr.length, 2)) println("i = " + intArr(i))
i = 1
i = 3
i = 5

// 降序输出
scala> for(i<- (0 until intArr.length).reverse) println("i = " + intArr(i))
i = 5
i = 4
i = 3
i = 2
i = 1

4.数组转换

// 生成新的数组,原数组不变
// 缓冲数据转换后产生的仍然是缓冲数组
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

scala> var bufferArray = ArrayBuffer(10, 20, 30, 40, 50)
bufferArray: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(10, 20, 30, 40, 50)

scala> var intArrBuffer = for(i <- bufferArray) yield i * 10
intArrBuffer: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(100, 200, 300, 400, 500)

// 定长数组转转后产生的仍然是定长数组,原数组不变
scala> var array = Array(1, 2, 3, 4, 5)
array: Array[Int] = Array(1, 2, 3, 4, 5)

scala> var intArray = for(i <- array) yield i * 2
intArray: Array[Int] = Array(2, 4, 6, 8, 10)

// 加入过滤条件
scala> var intArray = for(i <- array if i > 2) yield i * 2
intArray: Array[Int] = Array(6, 8, 10)

5.数组操作中的常用算法

scala> val intArr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
intArr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// 求和
scala> intArr.sum
res7: Int = 55

// 最大值
scala> intArr.max
res8: Int = 10

// 最小值
scala> intArr.min
res9: Int = 1

// toString
scala> intArr.toString()
res10: String = [I@11eb8842

// mkString
scala> intArr.mkString(",")
res11: String = 1,2,3,4,5,6,7,8,9,10

// 从小到大
scala> intArr.sorted.toBuffer
res12: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 从大到小
scala> intArr.sorted.reverse.toBuffer
res16: scala.collection.mutable.Buffer[Int] = ArrayBuffer(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

// 从小到大
scala> intArr.sortBy(x => x).toBuffer
res18: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 从大到小
scala> intArr.sortWith(_>_).toBuffer
res19: scala.collection.mutable.Buffer[Int] = ArrayBuffer(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

// 从小到大
scala> intArr.sortWith(_<_).toBuffer
res20: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 从大到小
scala> intArr.sortWith((x, y) => x > y).toBuffer
res21: scala.collection.mutable.Buffer[Int] = ArrayBuffer(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

// 从小到大
scala> intArr.sortWith((x, y) => x < y).toBuffer
res22: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

6.多维数组

// 定义2行3列数组
scala> var multiDimArr = Array(Array(1, 2, 3), Array(2, 3, 4))
multiDimArr: Array[Array[Int]] = Array(Array(1, 2, 3), Array(2, 3, 4))

// 获取第一行第三列元素
scala> multiDimArr(0)(2)
res24: Int = 3

// 获取第二行第二列元素
scala> multiDimArr(1)(1)
res25: Int = 3

// 遍历第一行
scala> for(i <- multiDimArr(0)) println("i = " + i)
i = 1
i = 2
i = 3

// 遍历多维数组
scala> for(i <- multiDimArr) println(i.mkString(","))
1,2,3
2,3,4

猜你喜欢

转载自blog.csdn.net/HG_Harvey/article/details/82225535