一 变长参数 函数
实现一个可变长度参数列表 函数,举例如下:
def sum(args:Int*) = {
var result =0
for(arg<- args)
result +=arg
result
}
函数得到的是一个类型为Seq的参数,但是不能直接传入Seq。比如如下的写法是错误的
var s = sum(1 to 5)
解决这个问题的方法是告诉编译器你希望这个参数被当做参数序列处理。追加 :_*,比如
var s =sum(1 to 5:_*)
二 过程
Scala对于不返回值的函数有特殊的表示法。如果 函数体包含在花括号中但没有前面的等号 =,那么返回类型就是Unit。这样的函数被称为过程(procedure),由于不返回值,我们可以省略等号。
三 数组
3.1 长度不变的数组
如果需要一个长度不变的数组,可以使用Scala中的Array
val nums = new Array[Int](10) //长度为10的定长数组,所有元素初始化为0
val s =Array("Hello","Array") //已经提供初始值,就不需要new
3.2 变长数组:数组缓冲
对于那种长度按需变化的数组,java有ArrayList,Scala的等效数据结构是ArrayBuffer.
一个空的缓冲区,准备存放数据
val b = ArrayBuffer[Int]() //或者 new ArrayBuffer[Int]
用+=在尾端添加元素
b+=1 //ArrayBuffer(1)
在尾端添加多个元素,用括号包起来
b+=(1,2,35) //ArrayBuffer(1,1,2,3,5)
移除尾端元素
b.trimEnd(5) //ArrayBuffer(1,1,2,5)
在缓冲数组的尾端添加或移除元素是一个高效的操作,但是在任意位置插入或移除元素并不高效。因为这之后的所有元素都需要平移。比如:
b.insert(2,6)
有时候你需要构建一个Array,但不知道最终需要装多少元素。这时,先构建一个数组缓冲,然后调用
b.toArray
反过来,调用a.toBuffer可以将一个数组a转换成一个数组缓冲
3.3 遍历数组和数组缓冲
以下是for 循环遍历数组或缓冲数组的语法
for(i< -0 until a.length)
println(i+","+a(i))
变量 i的取值从0 到a.length-1。注意 0 until 10实际上是调用 0.until(10)
如果想要每两个元素一跳,可以让i 这样遍历
0 until (a.length,2)
如果想从数组的尾端开始,遍历的写法如下
(0 until a.length).reverse
如果在数组不需要用到数组下标,可以如下方式访问数组
for (elem<-a ) printf(elem)
3.4 常用算法
Scala内建函数。
运算函数
Array(10,13,-9).sum //对ArrayBuffer同样适用
ArrayBuffer("Mary","had","little").max //little
sorted方法将数组或数组缓冲排序并返回排序后的数组或数组缓冲,但是不会修改原始版本
val b = ArrayBuffer(1,7,2,9)
val bSorted = b.sorted(_<_) //b没有改变
3.5 多维数组
举例来说,Double的二维数组类型为Array[Array[Double]]。要构造这样一个数组,可以用 ofDim方法
val matrix = Array.ofDim[Double](3,4) //三行,四列
matrix(row)(column) = 42