Scala入門系列(三):數組

來源:互聯網
上載者:User

標籤:[]   trim   markdown   UI   集合   index   不可變   insert   quick   

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, null)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 = falsescala> 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.sumsum: Int = 18scala> val max = a.maxmax: Int = 5scala> scala.util.Sorting.quickSort(a)scala> ares35: Array[Int] = Array(1, 2, 3, 3, 4, 5)scala> a.mkStringres36: String = 123345scala> a.mkString(",")res37: String = 1,2,3,3,4,5scala> a.mkString("<",",",">")res38: String = <1,2,3,3,4,5>// Array的toString有些問題scala> a.toStringres39: String = [[email protected]scala> b.toStringres40: String = ArrayBuffer(1, 6, 7, 8, 9, 10)

?

ArrayBuffer

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

scala> import scala.collection.mutable.ArrayBufferimport scala.collection.mutable.ArrayBufferscala> val b = ArrayBuffer[Int]()b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()// 使用+=添加一個或者多個元素,spark源碼中大量使用!!!scala> b += 1res17: 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> bres21: 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> bres24: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)// 使用remove()函數可以移除指定位置的一個或者多個元素scala> b.remove(1)res25: Int = 2scala> b.remove(1, 3)scala> bres27: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 6, 7, 8, 9, 10)// Array與ArrayBuffer互相轉化scala> b.toArrayres28: Array[Int] = Array(1, 6, 7, 8, 9, 10)scala> a.toBufferres29: 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*elea2: 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*elea2: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 9, 16, 25)
  1. 使用函數式編程
    _ 表示萬用字元
  • 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 = falsevar index = 0while(index < a.length) {  if (a(index) >= 0) {    index += 1  }  else {    if (!foundFirstNegative) {foundFirstNegative=true; index += 1}    else { a.remove(index)}  }}//檢索出所有需要元素的下標,然後將所有需要的元素左移至數組左側,刪除右側不需要的元素。//改良版,效能較高var foundFirstNegative = falseval 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)

Scala入門系列(三):數組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.