4莫辨、Scala基礎(chǔ)之?dāng)?shù)組

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("(", " ", ")"))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末依溯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瘟则,更是在濱河造成了極大的恐慌黎炉,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醋拧,死亡現(xiàn)場離奇詭異慷嗜,居然都是意外死亡,警方通過查閱死者的電腦和手機丹壕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門庆械,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菌赖,你說我怎么就攤上這事缭乘。” “怎么了琉用?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵忿峻,是天一觀的道長。 經(jīng)常有香客問我辕羽,道長逛尚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任刁愿,我火速辦了婚禮绰寞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己滤钱,他們只是感情好觉壶,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著件缸,像睡著了一般铜靶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上他炊,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天争剿,我揣著相機與錄音,去河邊找鬼痊末。 笑死蚕苇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凿叠。 我是一名探鬼主播涩笤,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盒件!你這毒婦竟也來了蹬碧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炒刁,失蹤者是張志新(化名)和其女友劉穎恩沽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體切心,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年片吊,在試婚紗的時候發(fā)現(xiàn)自己被綠了绽昏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡俏脊,死狀恐怖全谤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爷贫,我是刑警寧澤认然,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站漫萄,受9級特大地震影響卷员,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腾务,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一毕骡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦未巫、人聲如沸窿撬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劈伴。三九已至,卻和暖如春握爷,著一層夾襖步出監(jiān)牢的瞬間跛璧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工饼拍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赡模,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓师抄,卻偏偏與公主長得像漓柑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子叨吮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的A静肌! 因為Scala是基于Java虛擬機茶鉴,也就是...
    燈火gg閱讀 3,448評論 1 24
  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的7媪帷! 因為Scala是基于Java虛擬機涵叮,也就是...
    義焃閱讀 606評論 0 1
  • 1.1. 什么是Scala Scala是一種多范式的編程語言惭蹂,其設(shè)計的初衷是要集成面向?qū)ο缶幊毯秃瘮?shù)式編程的各種特...
    文子軒閱讀 1,533評論 1 3
  • 數(shù)組 :new Array[Int](8)與Array[Int](8)的區(qū)別:第一種8個元素,第二個定義一個值為8...
    夙夜M閱讀 1,777評論 1 2
  • 2016.9.15(中秋節(jié)):與你相識 月亮是圓圓的割粮,你我是陌生的盾碗,緣分就這樣注定了,在這特殊的時刻舀瓢。 我在忙里忙...
    暗戀月亮的小蔥閱讀 304評論 4 15