Scala与Java差异(四)之数组操作
生活随笔
收集整理的這篇文章主要介紹了
Scala与Java差异(四)之数组操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、數組操作之Array、ArrayBuffer以及遍歷數組
(1)Array
在Scala中,Array代表的含義與Java中類似,也是長度不可改變的數組。此外,由于Scala與Java都是運行在JVM中,雙方可以互相調用,因此Scala數組的底層實際上是Java數組。例如字符串數組在底層就是Java的String[],整數數組在底層就是Java的Int[]。
// 數組初始化后,長度就固定下來了,而且元素全部根據其類型初始化 val a = new Array[Int](10) a(0) a(0) = 1 val a = new Array[String](10)// 可以直接使用Array()創建數組,元素類型自動推斷 val a = Array("hello", "world") a(0) = "hi" val a = Array("leo", 30)(2)ArrayBuffer
在Scala中,如果需要類似于Java中的ArrayList這種長度可變的集合類,則可以使用ArrayBuffer。
// 如果不想每次都使用全限定名,則可以預先導入ArrayBuffer類 import scala.collection.mutable.ArrayBuffer// 使用ArrayBuffer()的方式可以創建一個空的ArrayBuffer val b = ArrayBuffer[Int]()// 使用+=操作符,可以添加一個元素,或者多個元素 // 這個語法必須要謹記在心!因為spark源碼里大量使用了這種集合操作語法! b += 1 b += (2, 3, 4, 5)// 使用++=操作符,可以添加其他集合中的所有元素 b ++= Array(6, 7, 8, 9, 10)// 使用trimEnd()函數,可以從尾部截斷指定個數的元素 b.trimEnd(5) // 使用insert()函數可以在指定位置插入元素 // 但是這種操作效率很低,因為需要移動指定位置后的所有元素 b.insert(5, 6) b.insert(6, 7, 8, 9, 10) // 使用remove()函數可以移除指定位置的元素 b.remove(1) b.remove(1, 3) // Array與ArrayBuffer可以互相進行轉換 b.toArray a.toBuffer(3)遍歷Array和ArrayBuffer
// 使用for循環和until遍歷Array / ArrayBuffer // 使until是RichInt提供的函數 for (i <- 0 until b.length)println(b(i)) // 跳躍遍歷Array / ArrayBuffer for(i <- 0 until (b.length, 2))println(b(i)) // 從尾部遍歷Array / ArrayBuffer for(i <- (0 until b.length).reverse)println(b(i)) // 使用“增強for循環”遍歷Array / ArrayBuffer for (e <- b)println(e)(4)?數組常見操作
// 數組元素求和 val a = Array(1, 2, 3, 4, 5) val sum = a.sum // 獲取數組最大值 val max = a.max // 對數組進行排序 scala.util.Sorting.quickSort(a) // 獲取數組中所有元素內容 a.mkString a.mkString(", ") a.mkString("<", ",", ">") // toString函數 a.toString b.toString?
三、數組操作之數組轉換
(1)使用yield和函數式編程轉換數組
// 對Array進行轉換,獲取的還是Array val a = Array(1, 2, 3, 4, 5) val a2 = for (ele <- a) yield ele * ele// 對ArrayBuffer進行轉換,獲取的還是ArrayBuffer val b = ArrayBuffer[Int]() b += (1, 2, 3, 4, 5) val b2 = for (ele <- b) yield ele * ele// 結合if守衛,僅轉換需要的元素 val a3 = for (ele <- if ele % 2 == 0) yield ele * ele// 使用函數式編程轉換數組(通常使用第一種方式) a.filter(_ % 2 == 0).map(2 * _) a.filter { _ % 2 == 0 } map { 2 * _ }(2)算法案例:移除第一個負數之后的所有負數
// 構建數組 val a = ArrayBuffer[Int]() a += (1, 2, 3, 4, 5, -1, -3, -5, -9)// 每發現一個第一個負數之后的負數,就進行移除,性能較差,多次移動數組 var foundFirstNegative = false var arrayLength = a.length var index = 0 while (index < arrayLength) {if (a(index) >= 0) {index += 1} else {if (!foundFirstNegative) { foundFirstNegative = true; index += 1 }else { a.remove(index); arrayLength -= 1 }} }(3)算法案例:移除第一個負數之后的所有負數(改良版)
// 重新構建數組 val a = ArrayBuffer[Int]() a += (1, 2, 3, 4, 5, -1, -3, -5, -9)// 每記錄所有不需要移除的元素的索引,稍后一次性移除所有需要移除的元素 // 性能較高,數組內的元素遷移只要執行一次即可 var foundFirstNegative = false val keepIndexes = for (i <- 0 until a.length if !foundFirstNegative || a(i) >= 0) yield {if (a(i) < 0) foundFirstNegative = truei } for (i <- 0 until keepIndexes.length) { a(i) = a(keepIndexes(i)) } a.trimEnd(a.length - keepIndexes.length)?
?
?
?
?
總結
以上是生活随笔為你收集整理的Scala与Java差异(四)之数组操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一时强弱在于力万古胜负在于理的意思 含义
- 下一篇: Scala与Java差异(五)之Map与