Scala学习笔记(3)
数组
-----------------------------------
0.若长度固定则用Array,若长度可能变化则使用ArrayBuffer
1.提供初始值的时候不要使用new。
2.用()来访问元素
3.使用for(elem<-arr)来遍历元素
4.用for(elem<- arr if ....)...yield...来将原数组转换成新数组
5.Scala数组和java数组可以互操作;用ArrayBuffer,使用scala.collection.JavaConversions中的转换函数。
1.定长数组
(1)如果需要一个长度不变的一个数组,可以用Array
val nums = new Array[Int](10) //10个整数的数组,将所有元素初始化为0
val a = new Array[String](10) //10个字符串数组,所有元素初始化都为null
val s = Array("Hello","World") //长度为2的Array[String]----类型是推断出来的
//说明:已经提供初始值就不需要new
s(0) = "Goodbye" //Array("Goodbye","World"),使用()而不是[]来访问元素
2.边长数组:数组缓冲。对于长度按照需要变化的数组,java有ArrayList。Scala中有ArrayBuffer
import scala.collection.mutable.ArrayBuffer val b = ArrayBuffer[Int]() //或者new ArrayBuffer[Int],一个空的数组缓冲,用于存放整数 b+=1 //ArrayBuufer(1),用+=在尾端添加元素 b+=(1,2,3,5) //ArrayBuffer(1,1,2,3,5),在尾端添加多个元素,用括号括起来 b++=Array(8,13,21) //ArrayBuffer(1,1,2,3,5,8,13,21),可以用++=操作符追加任何集合 b.timeEnd(5) //ArrayBuffer(1,1,2),移除后面5个元素
在数组尾部添加或者溢出元素是比较高效的操作,也可以在任意位置插入或者移除元素,但是这样就没有那么高效了,所有在那个之后的元素都必须被平移。如:
b.insert(2,6) //ArrayBuffer(1,1,6,2),这是在下标2之前进行插入6操作 b.insert(2,7,8,9) //ArrayBuffer(1,1,7,8,9,6,2),可以插入任意多的元素 b.remove(2) //Array(1,1,8,9,6,2),移除下标为2上的元素 b.remove(2,3) //ArrayBuffer(1,1,2),第二个参数是要移除多少个元素
有的时候需要构建一个Array,但是不知道最终需要装进去多少个元素。在这种情况下先构建一个缓冲数组,然后调用:b.toArray
3.遍历数组和数组缓冲
for(i<-0 until a.length) println(i+":"+a(i)) //这个地方变量i的取值范围是从0到a.length-1.until是RichInt类的方法,返回所有小于(但是不包括)上限的数组
如 0 until 10 //Range(0,1,2,3,4,5,6,7,8,9)
如果想要每两个元素一条,可以让i这样进行遍历
//如果想要每两个元素一跳,可以这样遍历 0 until (a.length,2) //Range(0,2,4...) //如果要从数组尾端开始,遍历方法如下: (0 until a.length).reverse //Range(...,2,1,0) //如果在循环体中不需要用到数组下标,可以直接这样访问数组 for(elem <- a) println(elem)
//定长数组的操作
var arr= new Array[Int](10); //创建一个定长数组,元素都为0 arr = Array(1,2,3) //将arr中的0,1,2号位置上的0,0,0换成1,2,3 arr(0) //取出第一个位置上的元素
//边长数组操作
import scala.collection.mutable.ArrayBuffer //先进行导包操作 var buf = ArrayBuffer[Int]() //创建数组缓冲区对象
//溢出末尾两个元素
buf.trimEnd(2) //移除末尾两个元素 buf.trimStart(2) //移除开始两个元素
//yield 产生新值
val a = Array(2,3,5,7,11) val result = for(elem<- a) yield 2* elem //产生result是(4,6,10,14,22)
//守卫条件
// 返回大于5的偶数,类型为Vector val items = for(i <- 1 to 10 if i % 2 == 0 if i > 5) yield i;
5.常用的算法
Array(1,7,2,9).sum //19 对ArrayBuffer同样适用,使用sum方法,元素类型必须是数值类型:要么是整数,要么是浮点型或者BigInteger/BigDecimal
ArrayBuffer("Mary","had","a","little","lamb").max //返回little,max和min输出数组或者数组缓冲区中最大或者最小的元素
//sorted()方法
val b = ArrayBuffer(1,7,2,9) val bSorted = b.sourted(_<_) //ArrayBuffer(1,7,2,9) val bsorted=b.sorted(_>_) //ArrayBuffer(9,7,2,1)
//可以直接对一个数组进行排序,但是不能对缓冲区进行排序
val a =Array(1,7,2,9) scala.util.Sorting.quickSort(a) // Array(1,2,7,9) //如果想要显示数组或者缓冲区的内容,可以使用mkString方法,允许在指定的元素之间的分隔符 a.mkString("and" ) //"1 and 2 and 7 and 9" a.mkString("<",",",">") //"<1,2,7,9>" //相对于toString相比: a.toString //这是java的方法,毫无意义 b.toString //"ArrayBuffer(1,7,2,9)"
7.多维数组
和java一样,多维数组是通过数组的数组来实现的。如Double的二维数组类型为Array[Array[Double]],构造这样的一个数组可以用ofDim方法: var matrix=Array.ofDim[Double]{3,4} //定义一个3行4列的二维数组
要访问其中的元素,使用两对圆括号:matrix(row)(column)=42
8.与java的互操作,导入转换类,使用的是隐式转换,
scala>import scala.collection.javaConversions.bufferAsJavaList
而要访问其中的元素,每一行的长度不相同