3.1定长数据
val nums= new Array[int] (10) //数组长度10,所有元素初始化为0
val a=new Array[String] (10) //数组长度10,所有元素初始化为null
val s=Array("Hello","word") //已提供初始值就不需要new
s(0)="Goodbye" //使用()来访问元素
3.2 变长数组:数组缓冲
对于那种长度按需要变化的数组,java有ArrayList ,Scala中等效数据结构为ArrayBuffer
import scala.collection.mutable.ArrayBuffer
var b=ArrayBuffer[int]() //一个空的数组缓冲,准备存放int类型数据
b+=1 //用+=在尾端添加元素
b+=(1,2.3,4)
b++=Array(12,12,13) //使用++=添加集合
b.trimEnd(5) //移除b中最后5个元素
在数组尾端添加移除袁术是最高效的,也可以在任意位置添加移除,但效率不高,所有在那个元素之后的元素都需要平移
b.insert(2,6) //在下标2之前插入6
b.insert(2,7,8,9) //在下标2之前插入7,8,9)
b.remove(2) //移除下标为2的元素
b.remove(2,3) //从下标为2的元素开始,移除3个元素
数据和数组缓冲都可以相互转换:a. toBuffer, b.toArray等。
3.3遍历数组和数组缓冲
for( i < - 区间)例如: for( i <- 0 util a.length) { 逻辑 }
如果想使用两个元素一跳,可以这些写0 util (a.length,2) //Rang(0,2,4....)
如果要数组的尾端开始 (0 Until a.length).reverse
3.4 数组转换
通过数组转换,可以在保持原数组不变的前提下,生产一个新的数组
val a=Array(2,3,5,7,11)
val result=for (elem<-a) yield 2* elem //result的结果是:Array(4,6,10,14,22)
for (....) yield 循环创造了一个新数组,数组缓冲ArrayBuffer也可以使用这种方式得到一个新的数组缓冲
一般处理集合时,我们只处理满足条件的元素,这个需求可以通过守卫:for中的if来实现。
for( elem<- a if elem% 2==0) yield elem*2 //原始集合并没有收影响。
也可以采取另外一种写法 a.filter(_%2==0).map(2*_)或者 a.filter{_%2==0}.map(2*_)
3.5 常用算法
1.sum方法元素类型必须是整型,比如Array(1,2,3).sum
2. min,max求最小最大值
3. sorted方法用于对数组进行排序返回一个新的数组或者数组缓冲(ArrayBuffer),这个过程不会修改原始数组
4.你还可以提供一个比较函数,不过你需要使用sortWith方法
val bDesc=b.sortWith(_>_)
注意:你可以对一个数组进行排序,但不能对数组缓冲进行排序
val a=Array(1,7,2,9)
scals.util.Sorting.quickSort(a)
对应min,max,quickSort方法,元素类型必须支持比较操作,这包括了数字,字符串以及其它带有order特质的类型。
最后,显示数组和数组缓冲的内容可以用mkString方法,它允许指定元素之间的分隔符。
a.mkString(" and ") // " 1 and 2 and 3"
a.mkString("<",",",">") // "<1,2,7,9>"
3.6解读Scaladoc
查看36页
3.7多维数组
Double二维数组的类型为Array[Array[Double]], 可以用ofDim方法构造二维数组
var matrix=Array.ofDim[Double](3.4) //三行、四列
要访问其中的元素
matrix(row)(column)=42
当然还可以创建不规则数组,没一行的长度个不相同。
3.8 与JAVA互操作
由于Scala数组是用java数组实现的,所以他们之间可以来回切换
举例来说:java.lang.ProcessBuilder类有一个List<String>为参数的构造器,以下是在Scala中调用它的写法
import scala.collection.JavaConversions.bufferAsJavaList
import scala.collection.mutable.ArrayBuffer
varl command=ArrayBuffer("ls","-al")
val pb=new ProcessBulider(command) //Scala到java转换
Scala的ArraryBuffer被包装成一个实现了java.util.List接口的Java类对象。
反过来,当Java方法返回java.util.List时,我们可以让他自动转换为一个Buffer
import scala.collection.JavaConversions.asScalaBuffer
import scala.collection.mutable.Buffer
val cmd:Buffer[String]=pb.command() //java转到scala,不能使用ArrayBuffer------包装起来的对象仅能保证是个Buffer.