定長數(shù)組
-
val nums = new ArrayInt
- 10個整數(shù)的數(shù)組,所有元素初始化為0
-
val a = new ArrayString
- 10個元素的字符串數(shù)組藤违,所有元素初始化為null
-
val s = Array("Hello", "World")
長度為2的Array[String] 浪腐,是通過類型推斷出來的
已經提供初始值就不需要new
-
s(0) = "Goodbye"
Array("Goodbye", "World")
使用()而不是[]來訪問元素
變長數(shù)組
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個參數(shù)開始,一共移除3個元素
b.toArray 和 a.toBuffer 可以相互轉換顿乒,即定長數(shù)組和變長數(shù)組的轉換
遍歷數(shù)組和數(shù)組緩沖
-
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)
如果不需要下標淆游,則可以直接訪問數(shù)組元素
類似Go語言的 for _,v:=range a {}
數(shù)組轉換
-
val result = for (elem<-a) yield 2*elem
- 如果a是一個Array傍睹,則返回的結果就是一個Array,如果a是一個ArrayBuffer犹菱,則返回的結果就是一個ArrayBuffer拾稳,原始的a則不會發(fā)生改變
-
val result = for(elem <-a if elem %2 == 0) yield 2*elem
- 表達式后面可以有一個if守衛(wèi)
-
另外的做法
a.filter( _ % 2 == 0).map( 2 * _ ) a.filter { _ % 2 ==0 } map { 2 * _ }
常用算法
-
scala有內建的函數(shù)來處理基本的求和與排序
-
.sum
Array(1, 7, 2, 9).sum
只能是整型、浮點腊脱、BigInteger/BigDecimal
-
.min .max
輸出最小访得、最大的元素
可以是數(shù)字或字符串
不會對原始數(shù)組有修改
-
.sortWith( _ > _)
自定義比較函數(shù)
函數(shù)的語法參數(shù)見12章
-
val a = Array(1, 7, 2, 9)
scala.util.Sorting.quickSort(a)- 此方法可以對Array進行排序,但是不能對ArrayBuffer進行排序,而且本身的內容會發(fā)生改變
備注:如果想將數(shù)組顯示出來悍抑,可以使用 mkString鳄炉,如果使用toString, 則顯示出來的結果是沒有意義的
-
解讀Scaladoc
多維數(shù)組
val matrix = Array.ofDim[Double](3,4)
// 創(chuàng)建一個3行4列的Double數(shù)組
val triangle = new Array[Array[Int]](10)
// 創(chuàng)建一個有10行的null數(shù)組
matrix(row)(column)
// 訪問第三行,第四列的數(shù)據
與Java的互操作
Scala數(shù)組是用Java數(shù)組實現(xiàn)的
-
從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()