Scala基礎(4):陣列
阿新 • • 發佈:2019-01-28
import scala.collection.mutable.ArrayBuffer
object Demo {
def main(args: Array[String]) {
changInt // 呼叫函式
}
def changInt: Unit = {
val a = Array(1, -2, 0, -3, 0, 4, 5) //定義一個固定長度的陣列
val b = sigNumArr(a)
b.foreach(println) // 迭代輸出
}
def sigNumArr(arr: Array[Int]) = {
val buf = new ArrayBuffer[Int]() // 定義一個數組緩衝(不定長陣列)
buf ++= (for (i <- arr if i > 0) yield i) // ++= 連線一個數組
buf ++= (for (i <- arr if i == 0) yield i)
buf ++= (for (i <- arr if i < 0) yield i)
//println(buf)
buf.toArray // 將陣列緩衝轉換成陣列
}
}
陣列
建立
//固定陣列
val arr1 = new Array[Int](3 ) // 初始值都是0
val arr2 = Array("Hello", "World") // 不用new關鍵字
//陣列緩衝
val arrBuffer = new ArrayBuffer[Int]()
元素訪問
陣列訪問呼叫角標的時候使用的是()不是[]
陣列緩衝的trimEnd方法十分高效,邏輯可以儘量往這邊靠攏
//固定陣列
arr2(0) = "Hi" //設定角標為0的值
println(arr2(0)) // 輸出 Hi
//陣列緩衝
arrBuffer += 12 // 新增元素 12
println(arrBuffer(0)) // 輸出 12
arrBuffer ++= arr // 新增 arr 所有元素後:12 0 0 0
arrBuffer.insert(2,5) //在角標處插入元素後:12 0 5 0 0
arrBuffer.trimEnd(3) //刪除倒數第 3 個元素後:12 0 0 0
轉換
val arr = arrBuffer.toArray //陣列緩衝轉化成固定陣列
val arrBuffer = arr.toBuffer //固定陣列轉化成陣列緩衝
遍歷
for (i <- 0 until arrBuffer.length) print(arrBuffer(i))
for (i <- arrBuffer.indices) print(arrBuffer(i))// arrBuffer.indices相當於0 until arrBuffer.length
for (i <- 0 until(arrBuffer.length, 2)) print(arrBuffer(i)) // 每兩個一跳(會不會視為元組?)
for (i <- (0 until arrBuffer.length).reverse) print(arrBuffer(i)) // 從尾部開始遍歷
for (elem <- arrBuffer) println(elem)
arrBuffer.foreach(println) //輸出每一個值
陣列轉換
val a = Array(2, 3, 4, 5)
val b = for (elem <- a) yield elem // 通過for yield 返回的是陣列或者陣列緩衝
val c = for (elem <- a if elem % 2 == 0) yield elem //使用守衛過濾奇數,for yield是不會影響原陣列或陣列緩衝的
常用方法
// 逆序
arr.reverse:返回array的逆序
arrayBuffer.reverse:返回arrayBuffer的逆序
// 求和
val a1 = Array(1, 2, 3, 4).sum //10
println("常用演算法a1:" + a1)
val a2 = ArrayBuffer(1, 2, 3, 4).sum //10
println("常用演算法a2:" + a2)
// 統計
val a = arr.count(_ < a)//統計陣列arr中小於a的個數
val a = arr.count(_ == a)//統計陣列arr中等於a的個數
val a = arr.count(_ > a)//統計陣列arr中大於a的個數
// 極值
val b1 = Array("Mary", "had", "little").max //"little"
println("常用演算法b1:" + b1)
val b2 = ArrayBuffer("Mary", "had", "little").max //"little"
println("常用演算法b2:" + b2)
// 排序(新建另一個數組)
val c1 = ArrayBuffer(1, 7, 9, 3)
println("常用演算法c1:" + c1)
val cSorted1 = c1.sorted //原陣列不會發生改變,cStorted1:1,3,7,9
println("常用演算法cSorted1:" + cSorted1)
val c2 = ArrayBuffer(1, 7, 9, 3)
println("常用演算法c2:" + c2)
val cSorted2 = c2.sorted //原陣列不會發生改變,cStorted2:1,3,7,9
println("常用演算法cSorted2:" + cSorted2)
// 排序(不新建陣列)
val d1 = Array(1, 7, 9, 3)
scala.util.Sorting.quickSort(d1)//只能用於固定長度陣列
printArray(d1)
val s = "HelloWorld"
val str = s.take(3) //順序取 第三個以前 Hel
val str = s.drop(3) //順序取 第三個以後 loWorld
val str = s.takeRight(3) //逆序取 倒數第三個以後 rld
val str = s.dropRight(3) //逆序取 倒數第三個以前 HelloWo
val str = s.substring(1,3) //前閉後開 el
多維陣列
val arr1 = Array.ofDim[Int](3, 4) // 直接建立 3行4列
//不規則多維陣列
val arr2 = new Array[Array[Int]](10) // 建立不規則多維陣列
for (i <- 0 until arr2.length) arr2(i) = new Array[Int](i + 1)// 賦值