《快學 Scala》 學習筆記 - Chapter 3

定長數(shù)組

  • val nums = new ArrayInt

    • 10個整數(shù)的數(shù)組,所有元素初始化為0
  • val a = new ArrayString

    • 10個元素的字符串數(shù)組藤违,所有元素初始化為null
  • val s = Array("Hello", "World")

    • 長度為2的Array[String] 浪腐,是通過類型推斷出來的

    • 已經提供初始值就不需要new

  • s(0) = "Goodbye"

    • Array("Goodbye", "World")

    • 使用()而不是[]來訪問元素

變長數(shù)組

  • import scala.collection.mutable.ArrayBuffer

  • var b = ArrayBufferInt

  • var b = new ArrayBuffer[Int]

  • b+=1

    • 在末尾添加元素
  • b+=(1,2,3,5)

    • 在末尾添加多個元素
  • b++=Array(8,13,21)

    • 用 ++= 可以追加任何相同值類型的集合
  • b.trimEnd(5)

    • 移除最后5個元素
  • b.insert(2,6)

    • 在下標2之前插入
  • b.insert(2,7,8,9)

    • 可以插入任意多的元素
  • b.remove(2)

    • 移除第二個元素
  • b.remove(2,3)

    • 從第2個參數(shù)開始,一共移除3個元素
  • b.toArray 和 a.toBuffer 可以相互轉換顿乒,即定長數(shù)組和變長數(shù)組的轉換

遍歷數(shù)組和數(shù)組緩沖

  • for (i<- 0 until a.length)
    println(i+": "+a(i))

    • 變量i的取值從0到a.length-1
  • until是RichInt類的方法牛欢,返回的是一個Range, 實際調用是 0.until(10)

  • 0.until (a.length, 2)

    • 沒兩個元素一跳
  • (0 until a.length).reverse

    • 將Range反轉
  • for(elem <- a)

    • 如果不需要下標淆游,則可以直接訪問數(shù)組元素

    • 類似Go語言的 for _,v:=range a {}

數(shù)組轉換

  • val result = for (elem<-a) yield 2*elem

    • 如果a是一個Array傍睹,則返回的結果就是一個Array,如果a是一個ArrayBuffer犹菱,則返回的結果就是一個ArrayBuffer拾稳,原始的a則不會發(fā)生改變
  • val result = for(elem <-a if elem %2 == 0) yield 2*elem

    • 表達式后面可以有一個if守衛(wèi)
  • 另外的做法

    a.filter( _ % 2 == 0).map( 2 * _ )
    a.filter { _ % 2 ==0 } map { 2 * _ }
    

常用算法

  • scala有內建的函數(shù)來處理基本的求和與排序

    • .sum

      • Array(1, 7, 2, 9).sum

      • 只能是整型、浮點腊脱、BigInteger/BigDecimal

    • .min .max

      • 輸出最小访得、最大的元素

      • 可以是數(shù)字或字符串

      • 不會對原始數(shù)組有修改

    • .sortWith( _ > _)

      • 自定義比較函數(shù)

      • 函數(shù)的語法參數(shù)見12章

    • val a = Array(1, 7, 2, 9)
      scala.util.Sorting.quickSort(a)

      • 此方法可以對Array進行排序,但是不能對ArrayBuffer進行排序,而且本身的內容會發(fā)生改變
    • 備注:如果想將數(shù)組顯示出來悍抑,可以使用 mkString鳄炉,如果使用toString, 則顯示出來的結果是沒有意義的

解讀Scaladoc

多維數(shù)組

val matrix = Array.ofDim[Double](3,4)
// 創(chuàng)建一個3行4列的Double數(shù)組
val triangle = new Array[Array[Int]](10)
// 創(chuàng)建一個有10行的null數(shù)組
matrix(row)(column)
// 訪問第三行,第四列的數(shù)據

與Java的互操作

  • Scala數(shù)組是用Java數(shù)組實現(xiàn)的

  • 從Scala到Java

    import scala.collection.JavaConversions.bufferAsJavaList  
    import scala.collection.mutable.ArrayBuffer  
    val command = ArrayBuffer("ls", "-al", "/home/cay")  
    val pb = new ProcessBuilder(command)
    
  • 從Java到Scala

    import scala.collection.JavaConversions.asScalaBuffer  
    import scala.collection.mutable.Buffer  
    val cmd: Buffer[String]=pb.command()
    

練習

  • 第一題

    import scala.util.Random  
    val random= new Random  
    val n = 10  
    val a = Array[Int](n)  
    for (i<-0 until n) yield random.nextInt(n)
    
  • 第二題

    val a=Array(1,2,3,4,5)  
    for(i<-0 until (a.length, 2) if i+1<a.length) {val b=a(i);a(i)=a(i+1);a(i+1)=b}
    
  • 第三題

     val a=Array(1,2,3,4,5)  
      for(i<-0 until a.length ) yield  {   
        if (i % 2  == 0)  
            if( i+1<a.length){  
                a(i+1)  
            } else {  
                a(i)  
            }  
        else  
            a(i-1)  
      }
    
  • 第四題

    val a=Array(1,2,-3,4,5,-4)  
    val b=for(i<-0 until a.length if a(i)>0) yield  a(i)  
    val c=for(i<-0 until a.length if(a(i)<=0) ) yield a(i)   
    var result=ArrayBuffer[AnyVal]()  
    result++=b  
    result++=c
    
  • 第五題

    val a=Array[Double](1,2,-3,4,5,-4)  
    a.sum/a.length
    
  • 第六題

    val a=Array(1,2,-3,4,5,-4)  
    val newVal=for(i<-(0 until a.length).reverse) yield a(i)  
    for(i<-0 until a.length) a(i)=newVal(i)
    
    val a=ArrayBuffer(1,2,-3,4,5,-4)  
    for(i<-(0 until a.length).reverse) a+=a(i)  
    a.trimStart(a.length/2)
    
  • 第七題

    Array(1,2,3,4,4,4,4,5).distinct
    
  • 第九題

java.util.TimeZone.getAvailableIDs.filter(_.startsWith("America")).map(_.stripPrefix("America/")).sorted
  • 第十題

    import scala.collection.JavaConversions.asScalaBuffer  
    import scala.collection.mutable.Buffer  
    import java.awt.datatransfer._  
    val flavors=SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]  
    val param=new DataFlavor("X-test/test; foo=bar");  
    val pb = new ProcessBuilder(flavors.getNativesForFlavor(param))  
    val buf: Buffer[String]=pb.command()
    
《快學 Scala》 學習筆記 第三章.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末搜骡,一起剝皮案震驚了整個濱河市拂盯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌记靡,老刑警劉巖谈竿,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異摸吠,居然都是意外死亡空凸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門寸痢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呀洲,“玉大人,你說我怎么就攤上這事啼止〉蓝海” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵族壳,是天一觀的道長。 經常有香客問我趣些,道長仿荆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任坏平,我火速辦了婚禮拢操,結果婚禮上,老公的妹妹穿的比我還像新娘舶替。我一直安慰自己令境,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布顾瞪。 她就那樣靜靜地躺著舔庶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陈醒。 梳的紋絲不亂的頭發(fā)上惕橙,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音钉跷,去河邊找鬼弥鹦。 笑死,一個胖子當著我的面吹牛爷辙,可吹牛的內容都是我干的彬坏。 我是一名探鬼主播朦促,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼栓始!你這毒婦竟也來了务冕?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤混滔,失蹤者是張志新(化名)和其女友劉穎洒疚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坯屿,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡油湖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了领跛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乏德。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吠昭,靈堂內的尸體忽然破棺而出喊括,到底是詐尸還是另有隱情,我是刑警寧澤矢棚,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布郑什,位于F島的核電站,受9級特大地震影響蒲肋,放射性物質發(fā)生泄漏蘑拯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一兜粘、第九天 我趴在偏房一處隱蔽的房頂上張望申窘。 院中可真熱鬧,春花似錦孔轴、人聲如沸剃法。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贷洲。三九已至,卻和暖如春晋柱,著一層夾襖步出監(jiān)牢的瞬間恩脂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工趣斤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俩块,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像玉凯,于是被迫代替她去往敵國和親势腮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • 數(shù)組是一種可變的漫仆、可索引的數(shù)據集合捎拯。在Scala中用Array[T]的形式來表示Java中的數(shù)組形式 T[]。 v...
    時待吾閱讀 942評論 0 0
  • Scala的集合類可以從三個維度進行切分: 可變與不可變集合(Immutable and mutable coll...
    時待吾閱讀 5,802評論 0 4
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗盲厌。 張土汪:刷leetcod...
    土汪閱讀 12,724評論 0 33
  • 數(shù)組 :new Array[Int](8)與Array[Int](8)的區(qū)別:第一種8個元素署照,第二個定義一個值為8...
    夙夜M閱讀 1,752評論 1 2
  • scala文檔 包含內容 1基礎 2控制結構和函數(shù) 3數(shù)組相關操作 4映射和元組 5類 6對象 7.包和引入(x)...
    zlcook閱讀 996評論 0 3