1. 程式人生 > >好程式設計師大資料學習路線分享Scala系列之陣列

好程式設計師大資料學習路線分享Scala系列之陣列

好程式設計師大資料學習路線分享Scala系列之陣列,陣列(Array)

1. 定長陣列

建立一個定長陣列的方式

使用Array定義一個長度不變的陣列

object ArrayDemo {
  def main(args: Array[String]){
    //初始化一個長度為8的定長陣列,其所有元素均為0
    val arr1 = new Array[Int](8)
    //直接列印定長陣列,內容為陣列的hashcode值


    println(arr1)
    //將陣列轉換成陣列緩衝,就可以看到原陣列中的內容了
    //toBuffer會將陣列轉換長陣列緩衝
    println(arr1.toBuffer)

    //注意:如果不使用new獲取陣列,相當於呼叫了陣列的apply方法,直接為陣列賦值
    //初始化一個長度為1,值為10的定長陣列
    val
 arr2 = Array[Int](10)
    //輸出陣列元素值
    println(arr2.toBuffer)

    //定義一個長度為3的定長陣列
    val arr3 = Array("hadoop", "storm", "spark")
    //使用()來訪問元素
    println(arr3(2))

    //包含10個整數的陣列,初始化值為0 

    val nums = new Array[Int](10)
    //遍歷陣列
    for(i <- 0 until nums.length)
      print(s"$i:${nums(i)} ")
      println()

    //包含10個字串的陣列,初始化值為null
    val strs0 = new Array[String](10)
    for(i <- 0 until strs0.length)
      print(s"$i:${strs0(i)} ")
      println()

    //賦初值的字串陣列
    val strs1 = Array("hello" ,"world")
    for(i <- 0 until strs1.length)
      print(s"$i:${strs1(i)} ")
      println()

    //訪問並修改元素值
    strs1(0) = "byebye"
    for(i <- 0 until strs1.length)
      print(s"$i:${strs1(i)} ")
      println()

  }
}

result

2. 變長陣列

定義變長陣列的方式:

使用 ArrayBuffer定義長度按需變化的陣列。

import scala.collection.mutable.ArrayBuffer

object VarArrayDemo {
  def main(args: Array[String]){
    //定義一個空的可變長Int型陣列
    val nums =  ArrayBuffer[Int]()

    //在尾端新增元素
    nums += 1

    //在尾端新增多個元素
    nums += (2,3,4,5)

    //使用++=在尾端新增任何集合
    nums ++= Array(6,7,8)

   //這些操作符,有相應的 -= ,--=可以做陣列的刪減,用法同+=,++=
      
   //使用append追加一個或者多個元素
    nums.append(1)
    nums.append(2,3)
      
   //在下標2之前插入元素
    nums.insert(2,20)
    nums.insert(2,30,30)    

    //移除最後2元素
    nums.trimEnd(2)
    //移除最開始的一個或者多個元素
    nums.trimStart(1)
   
    //從下標2出移除一個或者多個元素
    nums.remove(2)
    nums.remove(2,2)
      
      
   //使用增強for迴圈進行陣列遍歷   
    for(elem <- nums)
      println(elem)
      
    //基於下標訪問使用增強for迴圈進行陣列遍歷
    for(i <- 0 until nums.length)
      println(nums(i))

  }
}

執行結果:

3. 遍歷陣列

1.增強for迴圈,參見變長陣列的程式碼

2.好用的until會生成腳標,0 until 10 包含0不包含10 參見定長陣列部分程式碼4.1.4. 陣列轉換

4. 陣列轉換

yield關鍵字將原始的陣列進行轉換會產生一個新的陣列,原始的陣列不變

bject ArrayTransfer {

  def main(args: Array[String]): Unit = {

    //使用for推導式生成一個新的陣列
    val a = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
    val res1 = for(elem <- a) yield 2*elem
    for(elem <- res1)
      print(elem+" ")
    println()

    //對原陣列元素過濾後生成一個新的陣列
    //將偶數取出乘以10後再生成一個新的陣列
    val res2 = for(elem <- a if elem%2 == 0)yield 2*elem
    for(elem <- res2)
      print(elem+" ")
    println()

    //使用filter和map轉換出新的陣列
    val res3 = a.filter(_ % 2 == 0).map(2 * _)
    for(elem <- res3)
      print(elem+" ")
    println()
  }

執行結果:

5. 陣列常用演算法

在Scala中,陣列上的某些方法對陣列進行相應的操作非常方便!

object ArrayAlgorithm {
  def main(args: Array[String]): Unit = {

    val a = Array(9, 1, 2, 5, 3, 7, 8, 4)

    //求和
    val res1 = a.sum
    println(res1)

    //求最大值
    val res2 = a.max
    println(res2)

    //排序
    val res3 = a.sorted
    // val res4 = a.sortWith(_>_)指定排序方式
    for(elem <- res3)
      print(elem + " ")
  }
}

執行結果: