定长数组
-
val nums = new ArrayInt
- 10个整数的数组,所有元素初始化为0
-
val a = new ArrayString
- 10个元素的字符串数组,所有元素初始化为null
-
val s = Array("Hello", "World")
长度为2的Array[String] ,是通过类型推断出来的
已经提供初始值就不需要new
-
s(0) = "Goodbye"
Array("Goodbye", "World")
使用()而不是[]来访问元素
变长数组
import scala.collection.mutable.ArrayBuffer
var b = ArrayBufferInt
var b = new ArrayBuffer[Int]
-
b+=1
- 在末尾添加元素
-
b+=(1,2,3,5)
- 在末尾添加多个元素
-
b++=Array(8,13,21)
- 用 ++= 可以追加任何相同值类型的集合
-
b.trimEnd(5)
- 移除最后5个元素
-
b.insert(2,6)
- 在下标2之前插入
-
b.insert(2,7,8,9)
- 可以插入任意多的元素
-
b.remove(2)
- 移除第二个元素
-
b.remove(2,3)
- 从第2个参数开始,一共移除3个元素
b.toArray 和 a.toBuffer 可以相互转换,即定长数组和变长数组的转换
遍历数组和数组缓冲
-
for (i<- 0 until a.length)
println(i+": "+a(i))- 变量i的取值从0到a.length-1
until是RichInt类的方法,返回的是一个Range, 实际调用是 0.until(10)
-
0.until (a.length, 2)
- 没两个元素一跳
-
(0 until a.length).reverse
- 将Range反转
-
for(elem <- a)
如果不需要下标,则可以直接访问数组元素
类似Go语言的 for _,v:=range a {}
数组转换
-
val result = for (elem<-a) yield 2*elem
- 如果a是一个Array,则返回的结果就是一个Array,如果a是一个ArrayBuffer,则返回的结果就是一个ArrayBuffer,原始的a则不会发生改变
-
val result = for(elem <-a if elem %2 == 0) yield 2*elem
- 表达式后面可以有一个if守卫
-
另外的做法
a.filter( _ % 2 == 0).map( 2 * _ ) a.filter { _ % 2 ==0 } map { 2 * _ }
常用算法
-
scala有内建的函数来处理基本的求和与排序
-
.sum
Array(1, 7, 2, 9).sum
只能是整型、浮点、BigInteger/BigDecimal
-
.min .max
输出最小、最大的元素
可以是数字或字符串
不会对原始数组有修改
-
.sortWith( _ > _)
自定义比较函数
函数的语法参数见12章
-
val a = Array(1, 7, 2, 9)
scala.util.Sorting.quickSort(a)- 此方法可以对Array进行排序,但是不能对ArrayBuffer进行排序,而且本身的内容会发生改变
备注:如果想将数组显示出来,可以使用 mkString,如果使用toString, 则显示出来的结果是没有意义的
-
解读Scaladoc
多维数组
val matrix = Array.ofDim[Double](3,4)
// 创建一个3行4列的Double数组
val triangle = new Array[Array[Int]](10)
// 创建一个有10行的null数组
matrix(row)(column)
// 访问第三行,第四列的数据
与Java的互操作
Scala数组是用Java数组实现的
-
从Scala到Java
import scala.collection.JavaConversions.bufferAsJavaList import scala.collection.mutable.ArrayBuffer val command = ArrayBuffer("ls", "-al", "/home/cay") val pb = new ProcessBuilder(command)
-
从Java到Scala
import scala.collection.JavaConversions.asScalaBuffer import scala.collection.mutable.Buffer val cmd: Buffer[String]=pb.command()
练习
-
第一题
import scala.util.Random val random= new Random val n = 10 val a = Array[Int](n) for (i<-0 until n) yield random.nextInt(n)
-
第二题
val a=Array(1,2,3,4,5) for(i<-0 until (a.length, 2) if i+1<a.length) {val b=a(i);a(i)=a(i+1);a(i+1)=b}
-
第三题
val a=Array(1,2,3,4,5) for(i<-0 until a.length ) yield { if (i % 2 == 0) if( i+1<a.length){ a(i+1) } else { a(i) } else a(i-1) }
-
第四题
val a=Array(1,2,-3,4,5,-4) val b=for(i<-0 until a.length if a(i)>0) yield a(i) val c=for(i<-0 until a.length if(a(i)<=0) ) yield a(i) var result=ArrayBuffer[AnyVal]() result++=b result++=c
-
第五题
val a=Array[Double](1,2,-3,4,5,-4) a.sum/a.length
-
第六题
val a=Array(1,2,-3,4,5,-4) val newVal=for(i<-(0 until a.length).reverse) yield a(i) for(i<-0 until a.length) a(i)=newVal(i)
val a=ArrayBuffer(1,2,-3,4,5,-4) for(i<-(0 until a.length).reverse) a+=a(i) a.trimStart(a.length/2)
-
第七题
Array(1,2,3,4,4,4,4,5).distinct
第九题
java.util.TimeZone.getAvailableIDs.filter(_.startsWith("America")).map(_.stripPrefix("America/")).sorted
-
第十题
import scala.collection.JavaConversions.asScalaBuffer import scala.collection.mutable.Buffer import java.awt.datatransfer._ val flavors=SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap] val param=new DataFlavor("X-test/test; foo=bar"); val pb = new ProcessBuilder(flavors.getNativesForFlavor(param)) val buf: Buffer[String]=pb.command()