Scala基础(5)- 数组
程序员文章站
2023-12-30 21:15:34
...
数组是最基本的数据结构。通常的语法或数据结构书都会先介绍数组,而后再介绍集合,链表,树,哈希表等等。我们也不例外。
定长数组
最简单的数组创建如下,记住方括号在Scala中用做泛型,相当于<>在Java中作用。
val nums = new Array[Int](10)
// 10个Integer的数组,初始值为零。
更简洁的数组创建像这样:
val s = Array("Hello", "World")
省略new的初始化,并且利用类型推断,无需指明类型。
数组元素的访问使用()。
s(0) = "Goodbye"
s不是val吗?为什么可以改变呢?s这里存的是一个数组的reference,reference不能变,但是其内容是可以改变的。另外说一句,遗憾的是,从C时代开始,Index从0开始这一违反人类正常思维的“习惯”一直沿用。
变长数组
Scala中的ArrayBuffer和Java中的ArrayList类似,长度可以改变。
import scala.collection.mutable.ArrayBuffer //注意到,ArrayBuffer在mutable的包中
val b = ArrayBuffer[Int]()
b += 1 //加元素
b += (1, 2, 3, 5) //加数组
数组遍历
可以使用Index
for (i <- 0 until a.length)
println(i + ": " + a(i))
也可以不用
for (elem <- a) println(elem)
要强调的是,对一个数组(或者其他集合)进行遍历以一种命令式的编程(imperative programming)。在Scala中,我们往往避免使用,而是使用函数式的方法。强调“做什么”而不是怎么做。以后还会遇到很多例子,你会逐步感受到它们的区别。
通用算法
Scala提供了很多内建通用算法,作用于数组,以及以后会谈到的其他数据类型如集合。比如sum,count,max,mKString等等。mKString是一个很使用的方法。参见下面的例子。
Array(1, 2, 3).sum // 6
ArrayBuffer(1, 2, 3).max // 3
val a = Array(1, 10, 2, 9)
scala.util.Sorting.quickSort(a) // 现在a变成了 Array(1, 2, 9, 10)
a.mkString(" and ")
// "1 and 2 and 9 and 10"