本篇主要讲Scala的Array、BufferArray、List,更多教程请参考: Scala教程
一、定长数组定义:html
//定义一个长度为10的数值数组 scala> val numberArray = new Array[int](10) numberArray:Array[Int] = Array(0,0,0,0,0,0,0,0,0,0) //定义一个长度为10的String类数组 scala> val strArray = new Array[String](10) strArray:Array[String] = Array(null, null, null, null, null, null, null, null, null, null) //由上能够看出,复杂对象类型在数组定义时被初始化为null,数值型呗初始化为0,而且上面复杂类型定义的时候必须加new,不然会报错 //提供初始值的定义数组 scala> val strArray2 = Array("First", "Second") //这里说明已提供初始值就不须要new strArray2:Array[String] = Array(First, Second) scala> strArray2(0) = "Goodbye" strArray2:Array[String] = Array(Goodbye, Second)
二、变长数组定义
对于长度须要变化的数组,Java有ArrayList,C++有vector。Scala中的等效数据结构为ArrayBuffer算法
//导入可变包,Scala中的可变集合都是放在mutable中,使用时要导入 scala> import scala.collection.mutable.ArrayBuffer import scala.collection.mutable.ArrayBuffer scala> val arrayBuffer = ArrayBuffer[Int]() arrayBuffer: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() //在尾部添加一个值 scala> arrayBuffer += 1 res17: arrayBuffer.type = ArrayBuffer(1) //在尾部添加多个元素 scala> arrayBuffer += (2, 3, 4, 5) res19: arrayBuffer.type = ArrayBuffer(1, 2, 3, 4, 5) //在尾部添加一个集合 scala> arrayBuffer ++= Array(6, 7, 8, 9) res20: arrayBuffer.type = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9) //移除最后2个元素 scala> arrayBuffer.trimEnd(2) //在开头移除1一个元素 scala> arrayBuffer.trimStart(2) scala> arrayBuffer res23: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(2, 3, 4, 5, 6, 7) //在任意位置插入或者删除元素 scala> arrayBuffer.insert(2, 6) //ArrayBuffer(2, 3, 6, 4, 5, 6, 7) scala> arrayBuffer.insert(1, 2, 3, 4) //ArrayBuffer(2, 1, 2, 3, 4, 3, 6, 4, 5, 6, 7) scala> arrayBuffer.remove(2) //ArrayBuffer(2, 1, 3, 4, 3, 6, 4, 5, 6, 7) scala> arrayBuffer.remover(1, 8) //ArrayBuffer(2, 7)
三、变长数组和定长数组转换api
//变长转换长定长 scala > arrayBuffer.toArray //Array(2, 7) //定长转换成变长 scala>res7.toBuffer //ArrayBuffer(2, 7)
四、遍历定长和变长数组数组
for(i <- 0 until.arrayBuffer.length) println(i + ": " + a(i))
0 until.arrayBuffer.length其实是一个方法调用,返回的是一个区间Range: 0.until(arrayBuffer.length)
for(i <- 区间)会让变量i遍历该区间的全部值
若是想要在区间中步长不为1,则:0 until (arrayBuffer.length, 2)
若是想要数组从尾端开始,则遍历的写法为:(0 until (arrayBuffer.length, 2)).reverse
数据结构
Scala也提供了一个和Java加强for循环相似的forapp
//加强for for(i <- arrayBuffer) println(i + ": " + a(i))
五、数组转换
在《Scala入门学习笔记二-基本数据类型、程序控制结构》提到在for循环推导式,能够利用原来的数组产生一个新的数组。函数
scala> val a = Array(2, 3, 5, 7, 11) a: Array[Int] = Array(2, 3, 5, 7, 11) //这里产生了一个新的数组,原来的数组也在 scala> val result = for(elem <- a) yield 2 * elem result: Array[Int] = Array(4, 6, 10, 14, 22)
若是for中使用的是定长数组,则for(...)...yield以后获得的是定长数组;若是使用的是变长数组,则会获得变长数组学习
scala> a.filter(_ % 2 == 0).map(2 * _) 甚至 scala>a.filter(_ % 2 == 0).map{2 * _}
例子:
给定一个整数的缓冲数组,咱们想要移除第一个负数以外的全部负数。有几种作法scala
//第一种作法: var first = true var n = a.length var i = 0 while(i < n){ if(a(i) > 0) i += 1 else{ if(first) {first = false; i += 1} else {a.remove(i); n-= 1} } } //第二种作法: //首先使用一个新数组用于记录知足条件的数组的下标 val first = true val indexes = for(i <- 0 until a.length if first || a(i) > 0) yield { if(a(i) < 0) first = false; i } //而后将元素移动到该去的位置,截断尾端 for(j <- o until indexes.length) a(j) = a(indexes(j)) a.trimEnd(a.length-indexes.length)
六、经常使用算法
Scala针对数组提供了一个经常使用的函数code
//定义一个整型数组 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 res87: Int = 55 //求最大值 scala> intArr.max res88: Int = 10 scala> ArrayBuffer("Hello","Hell","Hey","Happy").max res90: String = Hey //求最小值 scala> intArr.min res89: Int = 1 //排序 //sorted方法将数组或数组缓冲排序并返回通过排序的数组或数组缓冲,原始数组被保留 scala>val b = ArrayBuffer(1, 7, 2, 9) b:ArrayBuffer[Int] = ArrayBuffer(1, 7, 2, 9) scala>val bSorted = b.sorted(_<_) bSorted: ArrayBuffer[Int] = ArrayBuffer(1, 2, 7, 9) //toString()方法 scala> intArr.toString() res94: String = [I@141aba8 //mkString()方法 scala> intArr.mkString(",") res96: String = 1,2,3,4,5,6,7,8,9,10 scala> intArr.mkString("<",",",">") res97: String = <1,2,3,4,5,6,7,8,9,10>
七、ArrayBuffer Scaladoc解析
初学者在查看sacaladoc时经常会感到困惑,不用担忧,随着学习的深刻,api文档中的内容将逐渐清晰
下面给出两个示例:
++=方法传入的参数类型是TraversableOnce Trait的子类,它返回的是更新好的ArrayBuffer
dropWhile传入的是一个函数,该函数返回值是布尔类型,dropWhile反回的是操做后的ArrayBuffer
八、多维数组
和Java同样,多维数组是经过数组的数组来实现的。
//第一种构造方式 val metrix = Array.ofDim[Double](3, 4) //3行 4列 //访问其中的元素 metrix(row)(column) =42 //能够建立不规则的数组,每一行的长度不相同 val triangle = new Array[Array[Int]](10) for(i <- 0 until triangle.length) trianglr(i) = new Array[Int](i+1) //在建立的时候赋值 scala> val metrix = Array(Array(1, 2, 3), Array(2.3, 3.4), Array("asdf", "asdfas")) metrix: Array[Array[_ >: String with Double with Int]] = Array(Array(1, 2, 3), Array(2.3, 3.4), Arra y(asdf, asdfas)) //打印输出数组 scala> for(i <- metrix) println(i.mkString(" ")) 1 2 3 2.3 3.4 asdf asdfas //输出二维数组的每一个值 scala> for(i <- metrix; from = i; j <- from) println(j) 1 2 3 2.3 3.4 asdf asdfas