Scala入門系列(三):數組


Array

與Java的Array類似,也是長度不可變的數組,此外,由於Scala與Java都是運行在JVM中,雙方可以互相調用,因此Scala數組的底層實際上是Java數組。

注意:訪問數組中元素使用()而不是Java中的 []

scala> val a = new Array[String](10)
a: Array[String] = Array(null, null, null, null, null, null, null, null, null, n
ull)
scala> val a = new Array[Boolean](10)
a: Array[Boolean] = Array(false, false, false, false, false, false, false, false
, false, false)
scala> a(0)
res15: Boolean = false
scala> val a = new Array[Int](10)
a: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
scala> a(0) = 1


可以直接使用Array()創建數組,元素類型自動推斷(如果類型不一致則為公共父類型

scala> val a = Array("Hello", "World")
a: Array[String] = Array(Hello, World)
scala> val a = Array("Sparks", 30)
a: Array[Any] = Array(Sparks, 30)

// 常見操作
scala> val a = Array(3,4,1,2,5,3)
a: Array[Int] = Array(3, 4, 1, 2, 5, 3)
scala> val sum = a.sum
sum: Int = 18
scala> val max = a.max
max: Int = 5
scala> scala.util.Sorting.quickSort(a)
scala> a
res35: Array[Int] = Array(1, 2, 3, 3, 4, 5)
scala> a.mkString
res36: String = 123345
scala> a.mkString(",")
res37: String = 1,2,3,3,4,5
scala> a.mkString("<",",",">")
res38: String = <1,2,3,3,4,5>
// Array的toString有些問題
scala> a.toString
res39: String = [I@ffd26d1
scala> b.toString
res40: String = ArrayBuffer(1, 6, 7, 8, 9, 10)

ArrayBuffer

類似於Java中的ArrayList長度可變集合類

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
scala> val b = ArrayBuffer[Int]()
b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
// 使用+=添加一個或者多個元素,spark源碼中大量使用!!!
scala> b += 1
res17: b.type = ArrayBuffer(1)
scala> b += (2,3,4,5)
res18: b.type = ArrayBuffer(1, 2, 3, 4, 5)
// 使用++=添加其他集合中的所有元素
scala> b ++= Array(6, 7, 8, 9, 10)
res19: b.type = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// trimEnd方法可以從尾部截斷指定個數的元素
scala> b.trimEnd(5)
scala> b
res21: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)
// 使用insert()函數可以在指定位置插入一個或者多個元素,效率較低
scala> b.insert(5,6)
scala> b.insert(6, 7, 8, 9, 10)
scala> b
res24: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// 使用remove()函數可以移除指定位置的一個或者多個元素
scala> b.remove(1)
res25: Int = 2
scala> b.remove(1, 3)
scala> b
res27: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 6, 7, 8, 9, 10)
// Array與ArrayBuffer互相轉化
scala> b.toArray
res28: Array[Int] = Array(1, 6, 7, 8, 9, 10)
scala> a.toBuffer
res29: scala.collection.mutable.Buffer[Any] = ArrayBuffer(Sparks, 30)

遍歷Array和ArrayBuffer

  1. 使用until是RichInt提供的函數
    for (i <- 0 until b.length)
    print(b(i))

  2. 跳躍遍歷,步進長度
    for (i <- 0 until (b.length, 2))
    print(b(i))

  3. 從尾部遍歷
    for (i <- (0 until b.length).reverse)
    println(b(i))

  4. 使用“增強for循環”遍歷
    for (e <- b)
    println(e)

數組操作之數組轉換

1.使用yield

scala> val a = Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5)

scala> val a2 = for(ele <- a) yield ele*ele
a2: Array[Int] = Array(1, 4, 9, 16, 25)

scala> val a = ArrayBuffer(1,2,3,4,5)
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)

scala> val a2 = for(ele <- a) yield ele*ele
a2: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 9, 16, 25)

2.使用函數式編程
_ 表示通配符

  • a.filter(_ % 2 == 0).map(2 * _) (推薦方式)
  • a.filter{ _ % 2 == 0} map {2 * _}

實戰:移除第一個負數之后的所有負數

// 構建數組
scala> val a = ArrayBuffer[Int]()
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
scala> a += (1,2,3,4,5,-1,-3,-5,-9)
res45: a.type = ArrayBuffer(1, 2, 3, 4, 5, -1, -3, -5, -9)

// 發現第一個負數之后的負數,就進行移除,性能較差,多次移動數組
var foundFirstNegative = false
var index = 0
while(index < a.length) {
  if (a(index) >= 0) {
    index += 1
  }
  else {
    if (!foundFirstNegative) {foundFirstNegative=true; index += 1}
    else { a.remove(index)}
  }
}

//檢索出所有需要元素的下標,然后將所有需要的元素左移至數組左側,刪除右側不需要的元素。
//改良版,性能較高
var foundFirstNegative = false
val vaildIndex = for (i <- 0 until a.length if (!foundFirstNegative || a(i) >= 0)) yield {
  if (a(i) < 0) foundFirstNegative = true
  i
}
for(i <- 0 until vaildIndex.length) {a(i) = a(vaildIndex(i))}
a.trimEnd(a.length - vaildIndex.length)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM