Array
在Scala中,Array代表的含義與Java中類似毅访,也是長度不可改變的數(shù)組沮榜。此外,由于Scala與Java都是運行在JVM中喻粹,雙方可以互相調(diào)用蟆融,因此Scala數(shù)組的底層實際上是Java數(shù)組。例如字符串?dāng)?shù)組在底層就是Java的String[]守呜,整數(shù)數(shù)組在底層就是Java的Int[]
數(shù)組初始化后型酥,長度就固定下來了,而且元素全部根據(jù)其類型初始化
// 數(shù)組初始化后查乒,長度就固定下來了弥喉,而且元素全部根據(jù)其類型初始化
val nums = new Array[Int](10)
// 獲取值
println(nums(0))
// 更改值
nums(0) = 1
println(nums(0))
可以直接使用Array()創(chuàng)建數(shù)組,元素類型自動推斷
// 可以直接使用Array()創(chuàng)建數(shù)組玛迄,元素類型自動推斷
val strings = Array("Hello", "World")
println(strings(0))
strings(0) = "Hi"
println(strings(0))
val anys = Array("Hello", 10)
println(anys(0))
anys(0) = 20
println(anys(0))
ArrayBuffer
在Scala中由境,如果需要類似于Java中的ArrayList這種長度可變的集合類,則可以使用ArrayBuffer
使用蓖议,需要導(dǎo)包虏杰,import scala.collection.mutable.ArrayBuffer
// 使用ArrayBuffer()的方式可以創(chuàng)建一個空的ArrayBuffer
val arrayBuffer = ArrayBuffer[Int]()
// 使用+=操作符讥蟆,可以添加一個元素,或者多個元素,spark源碼里大量使用了這種集合操作語法
// 添加一個元素
arrayBuffer += 1
// 添加多個元素
arrayBuffer += (2,3,4,5,6)
// 使用++=操作符嘹屯,可以添加其他集合中的所有元素
arrayBuffer ++= Array(7, 8, 9, 10)
// 使用trimEnd()函數(shù)攻询,可以從尾部截斷指定個數(shù)的元素
arrayBuffer.trimEnd(5)
// 使用insert()函數(shù)可以在指定位置插入元素, 但是這種操作效率很低,因為需要移動指定位置后的所有元素
arrayBuffer.insert(5,20)
// 可以插入多個元素
arrayBuffer.insert(5,21,22,23,24,25,26)
// 使用remove()函數(shù)可以移除指定位置的元素
// 移除一個元素
arrayBuffer.remove(5)
// 移除多個元素
arrayBuffer.remove(5, 4)
// Array與ArrayBuffer可以互相進行轉(zhuǎn)換
val array = arrayBuffer.toArray
val buffer = array.toBuffer
遍歷Array和ArrayBuffer
使用for循環(huán)和until遍歷
for(i <- 0 until arrayBuffer.length){
if(i == 0)
print(arrayBuffer(i))
else if(i > 0 && i < arrayBuffer.length - 1)
print(" " + arrayBuffer(i))
else if(i == arrayBuffer.length - 1)
println(" " + arrayBuffer(i))
}
跳躍遍歷
for(i <- 0 until (arrayBuffer.length, 2)){
if(i == 0)
print(arrayBuffer(i))
else if(i > 0 && i < arrayBuffer.length - 1)
print(" " + arrayBuffer(i))
else if(i == arrayBuffer.length - 2)
println(" " + arrayBuffer(i))
}
從尾部遍歷
for(i <- (0 until arrayBuffer.length).reverse){
if(i == arrayBuffer.length - 1)
print(arrayBuffer(i))
else if(i > 0 && i < arrayBuffer.length - 1)
print(" " + arrayBuffer(i))
else if(i == 0)
println(" " + arrayBuffer(i))
}
使用增強for循環(huán)遍歷
for(e <- arrayBuffer) {
print(e + " ")
}
數(shù)組常見操作
// 求和
println(arrayBuffer.sum)
// 求最大值
println(arrayBuffer.max)
// 求最小值
println(arrayBuffer.min)
// 獲取數(shù)組中所有元素內(nèi)容
println(arrayBuffer.mkString)
// 獲取數(shù)組中所有元素內(nèi)容 帶分隔符
println(arrayBuffer.mkString(" "))
val array = arrayBuffer.toArray
// 排序州弟,需要導(dǎo)包import scala.util.Sorting.quickSort
quickSort(array)
// 獲取數(shù)組中所有元素內(nèi)容 帶開始和結(jié)束符號钧栖,帶分隔符
println(array.mkString("(", " ", ")"))
println(array.toString)
使用yield和函數(shù)式編程轉(zhuǎn)換數(shù)組
使用yield轉(zhuǎn)換數(shù)組
// 對Array進行轉(zhuǎn)換,獲取的還是Array
val nums1 = Array(1,2,3,4,5)
val toNum1 = for(num <- nums1) yield num * num
println(toNum1.mkString("(", " ", ")"))
// 對ArrayBuffer進行轉(zhuǎn)換婆翔,獲取的還是ArrayBuffer
val buffer = ArrayBuffer[Int]()
buffer += (1, 2, 3, 4, 5)
val toArrayBuffer = for(num <- buffer) yield num *num
println(toArrayBuffer.mkString("(", " ", ")"))
// 結(jié)合if守衛(wèi)拯杠,僅轉(zhuǎn)換需要的元素
val toArrayBuffer2 = for(ele <- buffer if ele % 2 == 0) yield ele * ele
println(toArrayBuffer2.mkString("(", " ", ")"))
使用函數(shù)式編程轉(zhuǎn)換數(shù)組
// 使用函數(shù)式編程轉(zhuǎn)換數(shù)組(通常使用yield方式)
// _占位符
val nums2 = nums1.filter(_ % 2 == 0).map(2 * _)
println(nums2.mkString("(", " ", ")"))
val nums3 = nums1.filter{_ % 2 == 0}.map{2 * _}
println(nums3.mkString("(", " ", ")"))
算法案例,移除第一個負數(shù)之后的所有負數(shù)
每發(fā)現(xiàn)一個第一個負數(shù)之后的負數(shù),就進行移除啃奴,性能較差潭陪,多次移動數(shù)組
方法一
val nums = ArrayBuffer[Int]()
nums += (1, 2, 3, -1, 5, 6, 7, -2, -5, -6)
var foundNegative = false
var index = 0
while(index < nums.length) {
if(nums(index) < 0) {
if(foundNegative == false) {
foundNegative = true
index += 1
}else {
nums.remove(index)
index -= 1
}
}else {
index += 1
}
}
println(nums.mkString("(", " ", ")"))
方法二
每記錄所有不需要移除的元素的索引,稍后一次性移除所有需要移除的元素
性能較高最蕾,數(shù)組內(nèi)的元素遷移只要執(zhí)行一次即可
val nums = ArrayBuffer[Int]()
nums += (1, 2, 3, -1, 5, 6,-2, 7, -2, -5, -6)
var foundNegative = false
val toNums = for(i <- 0 until nums.length if !foundNegative || nums(i) >= 0) yield {
if(nums(i) < 0) {
foundNegative = true
}
i
}
for(i <- 0 until toNums.length) {
nums(i) = nums(toNums(i))
}
nums.trimEnd(nums.length - toNums.length)
println(nums.mkString("(", " ", ")"))
方法三
直接生成一個新的Array
val nums = ArrayBuffer[Int]()
nums += (1, 2, 3, -1, 5, 6,-2, 7, -2, -5, -6)
var foundNegative = false
val toNums = for(i <- 0 until nums.length if !foundNegative || nums(i) >= 0) yield {
if(nums(i) < 0) {
foundNegative = true
}
nums(i)
}
println(toNums.mkString("(", " ", ")"))