




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Scala基礎(chǔ)智能手機(jī)給人們的生活提供了便利,但也可能會(huì)給人們?cè)斐衫_。對(duì)于陌生號(hào)碼的未接來(lái)電,用戶撥打回去可能需要支付長(zhǎng)途費(fèi)用,甚至該號(hào)碼有可能是詐騙分子的。合理使用大數(shù)據(jù)技術(shù),能夠大幅提高詐騙電話識(shí)別率,為構(gòu)建和諧社會(huì)提供助力。對(duì)于陌生號(hào)碼的未接來(lái)電,用戶其實(shí)可以查詢?cè)撎?hào)碼的歸屬地,我國(guó)的手機(jī)號(hào)碼一般分為3種類(lèi)型,即中國(guó)移動(dòng)、中國(guó)聯(lián)通和中國(guó)電信。每一個(gè)手機(jī)號(hào)碼都有固定的分布區(qū)域,這個(gè)區(qū)域即歸屬地。無(wú)論號(hào)碼被多少人注冊(cè)或注銷(xiāo)過(guò),其歸屬地都是不變的。在本次任務(wù)中,用戶可以查詢未接來(lái)電的歸屬地。如果未接來(lái)電號(hào)碼的歸屬地是親朋好友所在的城市,那么來(lái)電有可能是熟人的電話,可以撥打回去;如果不是,撥打回去則要做一定的詐騙防范措施。任務(wù)背景一般情況下,知道手機(jī)號(hào)碼的前7位數(shù)字即可查詢到歸屬地?,F(xiàn)有一份2020phonelocation.txt文件記錄了某個(gè)年份我國(guó)的手機(jī)號(hào)碼段及其歸屬地等相關(guān)信息,包含7個(gè)數(shù)據(jù)字段,分別為編號(hào)、號(hào)碼段、省份、市、號(hào)碼類(lèi)型、區(qū)號(hào)和郵編,如下表。通過(guò)這份文件的數(shù)據(jù)可以查詢特定手機(jī)號(hào)碼的類(lèi)型,統(tǒng)計(jì)某個(gè)地區(qū)的號(hào)碼段個(gè)數(shù),查詢某個(gè)地區(qū)的所有號(hào)碼段或查詢手機(jī)號(hào)碼的歸屬地等。本章將首先介紹Scala語(yǔ)言及其特性,并簡(jiǎn)要介紹Scala在不同系統(tǒng)下的安裝、配置過(guò)程,接著介紹Scala中的數(shù)據(jù)類(lèi)型,并詳細(xì)介紹Scala的常量、變量、函數(shù)、if判斷、for循環(huán)等內(nèi)容,結(jié)合手機(jī)號(hào)碼歸屬地查詢實(shí)例,編寫(xiě)Scala程序查詢手機(jī)號(hào)碼歸屬地等基本信息。任務(wù)背景1,1300000,山東,濟(jì)南,中國(guó)聯(lián)通,0531,2500002,1300001,江蘇,常州,中國(guó)聯(lián)通,0519,2130003,1300002,安徽,巢湖,中國(guó)聯(lián)通,0565,2380004,1300003,四川,宜賓,中國(guó)聯(lián)通,0831,6440005,1300004,四川,自貢,中國(guó)聯(lián)通,0813,6430001定義函數(shù)識(shí)別號(hào)碼類(lèi)型目錄安裝與運(yùn)行Scala2統(tǒng)計(jì)廣州號(hào)碼段數(shù)量3根據(jù)歸屬地對(duì)手機(jī)號(hào)碼段進(jìn)行分組4編寫(xiě)手機(jī)號(hào)碼歸屬地信息查詢程序5Scala是Spark編程常用的語(yǔ)言之一,本書(shū)進(jìn)行Spark編程時(shí)使用的語(yǔ)言也是Scala。因此,在學(xué)習(xí)Spark之前,需要先了解Scala語(yǔ)言、Scala安裝過(guò)程和基礎(chǔ)編程操作。本節(jié)的任務(wù)如下。了解Scala語(yǔ)言及其特性并安裝Scala,為后續(xù)Scala程序提供運(yùn)行環(huán)境。任務(wù)描述Scala是ScalableLanguage的縮寫(xiě),是一種多范式的編程語(yǔ)言,由洛桑聯(lián)邦理工學(xué)院的馬丁·奧德斯在2001年基于Funnel的工作開(kāi)始設(shè)計(jì),設(shè)計(jì)初衷是想集成面向?qū)ο缶幊毯秃瘮?shù)式編程的各種特性。Scala是一種純粹的面向?qū)ο蟮恼Z(yǔ)言,每個(gè)值都是對(duì)象。Scala也是一種函數(shù)式語(yǔ)言,因此函數(shù)可以當(dāng)成值使用。由于Scala整合了面向?qū)ο缶幊毯秃瘮?shù)式編程的特性,因此Scala相對(duì)于Java、C#、C++等其他語(yǔ)言更加簡(jiǎn)潔。Scala源代碼會(huì)被編譯成Java字節(jié)碼,因此Scala可以運(yùn)行于Java虛擬機(jī)(JavaVirtualMachine,JVM)之上,并可以調(diào)用現(xiàn)有的Java類(lèi)庫(kù)。了解Scala語(yǔ)言面向?qū)ο蠛瘮?shù)式編程靜態(tài)類(lèi)型可擴(kuò)展了解Scala特性通過(guò)瀏覽器查找Scastie并進(jìn)入,即可進(jìn)入Scala在線運(yùn)行環(huán)境。進(jìn)入Scastie界面后,在上窗格中輸入“println("helloworld")”。單擊“Run”按鈕,輸出信息將顯示在下窗格中,如下圖。安裝Scala1.在網(wǎng)頁(yè)上運(yùn)行ScalaScala運(yùn)行環(huán)境眾多,可以運(yùn)行在Windows、Linux、macOS等系統(tǒng)上。Scala是運(yùn)行在JVM上的語(yǔ)言,因此必須確保系統(tǒng)環(huán)境中安裝了JDK,即Java開(kāi)發(fā)工具包,而且必須確保JDK版本與本書(shū)安裝的Spark的JDK編譯版本一致,本書(shū)中使用的JDK是JDK8(Java1.8)。查看Java版本安裝Scala2.Scala環(huán)境設(shè)置(1)在Linux和macOS系統(tǒng)上安裝Scala從Scala官網(wǎng)下載Scala安裝包,安裝包名稱為“scala-2.12.15.tgz”將其上傳至/opt目錄解壓安裝包至/usr/local目錄下配置Scala環(huán)境變量安裝Scala3.Scala安裝(2)在Windows系統(tǒng)上安裝Scala從Scala官網(wǎng)下載Scala安裝包,安裝包名稱為“scala.msi”。雙擊scala.msi安裝包,開(kāi)始安裝軟件。進(jìn)入歡迎界面,單擊右下角的“Next”按鈕后出現(xiàn)許可協(xié)議選擇提示框,選擇接受許可協(xié)議中的條款并單擊右下角的“Next”按鈕。安裝Scala3.Scala安裝選擇安裝路徑,本文Scala的安裝路徑選擇在非系統(tǒng)盤(pán)的“D:\ProgramFiles(x86)\spark\scala\”,單擊“OK”按鈕進(jìn)入安裝界面。安裝Scala(2)在Windows系統(tǒng)上安裝Scala在安裝界面中單擊右下角的“Install”按鈕進(jìn)行安裝,安裝完成時(shí)單擊“Finish”按鈕完成安裝。右鍵單擊“此電腦”圖標(biāo),選擇“屬性”選項(xiàng),在彈出的窗口中選擇“高級(jí)系統(tǒng)設(shè)置”選項(xiàng)。在彈出的對(duì)話框中選擇“高級(jí)”選項(xiàng)卡,并單擊“環(huán)境變量”按鈕,在環(huán)境變量對(duì)話框中,選擇“Path”變量并單擊“編輯”按鈕,在Path變量中添加Scala安裝目錄的bin文件夾所在路徑,如“D:\ProgramFiles(x86)\spark\scala\bin”。安裝Scala(2)在Windows系統(tǒng)上安裝Scala運(yùn)行ScalaScala解釋器也稱為REPL(Read-Evaluate-Print-Loop,讀取-執(zhí)行-輸出-循環(huán))。在命令行中輸入“scala”,即可進(jìn)入REPL,如下圖。REPL是一個(gè)交互式界面,用戶輸入命令時(shí),可立即產(chǎn)生交互反饋。輸入“:quit”命令即可退出REPL,如下圖。運(yùn)行Scala右圖是一個(gè)Scala類(lèi),該類(lèi)實(shí)現(xiàn)了兩個(gè)數(shù)相加的方法。。如果要使用該方法,那么需要通過(guò)import加載該方法,如左圖,其中,add是類(lèi)名,addInt是方法名。1定義函數(shù)識(shí)別號(hào)碼類(lèi)型目錄安裝與運(yùn)行Scala2統(tǒng)計(jì)廣州號(hào)碼段數(shù)量3根據(jù)歸屬地對(duì)手機(jī)號(hào)碼段進(jìn)行分組4編寫(xiě)手機(jī)號(hào)碼歸屬地信息查詢程序5中國(guó)移動(dòng)、中國(guó)聯(lián)通和中國(guó)電信這3種類(lèi)型的手機(jī)號(hào)碼都有特定的手機(jī)號(hào)碼段。中國(guó)移動(dòng)的手機(jī)號(hào)碼段有1340~1348、135~139、150~152、157~159、182~184、187、188、178、147、1705等;中國(guó)聯(lián)通的手機(jī)號(hào)碼段有130~132、155、156、185、186、176、145、1709等;中國(guó)電信的手機(jī)號(hào)碼段有133、1349、153、180、181、189、1700、177等。本節(jié)的任務(wù)如下。使用數(shù)組分別存儲(chǔ)不同類(lèi)型的手機(jī)號(hào)碼段,并編寫(xiě)函數(shù)用于識(shí)別某個(gè)手機(jī)號(hào)碼段的類(lèi)型。任務(wù)描述Scala常用數(shù)據(jù)類(lèi)型了解數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型描述Int32位有符號(hào)補(bǔ)碼整數(shù)。數(shù)值區(qū)間為?32768~32767Float32位IEEE754(IEEE浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn))單精度浮點(diǎn)數(shù)Double64位IEEE754(IEEE浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn))雙精度浮點(diǎn)數(shù)String字符序列,即字符串Boolean布爾值,true或falseUnit表示無(wú)值,作用與Java中的void一樣,是不返回任何結(jié)果的方法的結(jié)果類(lèi)型。Unit只有一個(gè)實(shí)例值,寫(xiě)成()Scala會(huì)區(qū)分不同類(lèi)型的值,并且會(huì)基于使用值的方式確定最終結(jié)果的數(shù)據(jù)類(lèi)型,這稱為類(lèi)型推斷。Scala使用類(lèi)型推斷可以確定混合使用數(shù)據(jù)類(lèi)型時(shí)最終結(jié)果的數(shù)據(jù)類(lèi)型。如在加法中混用Int和Double類(lèi)型時(shí),Scala將確定最終結(jié)果為Double類(lèi)型,如下圖。了解數(shù)據(jù)類(lèi)型常量在程序運(yùn)行過(guò)程中值不會(huì)發(fā)生變化的量為常量或值,常量通過(guò)val關(guān)鍵字定義,常量一旦定義就不可更改,即不能對(duì)常量進(jìn)行重新計(jì)算或重新賦值。定義一個(gè)常量的語(yǔ)法格式如下。valname:type=initialization變量變量是在程序運(yùn)行過(guò)程中值可能發(fā)生改變的量。變量使用關(guān)鍵字var定義。與常量不同的是,變量定義之后可以重新被賦值。定義一個(gè)變量的語(yǔ)法格式如下。varname:type=initialization定義與使用常量、變量使用運(yùn)算符
運(yùn)算符意義示例算術(shù)運(yùn)算符+兩個(gè)數(shù)相加1+2或1.+(2)?兩個(gè)數(shù)相減1?2或1.?(2)*兩個(gè)數(shù)相乘1*2或1.*(2)/兩個(gè)數(shù)相除1/2或1./(2)%兩個(gè)數(shù)取余1%2或1.%(2)關(guān)系運(yùn)算符>
判斷左值是否大于右值,是則結(jié)果為真,否則結(jié)果為假1>2或1.>(2)<
判斷左值是否小于右值,是則結(jié)果為真,否則結(jié)果為假1<2或1.<(2)>=判斷左值是否大于等于右值,是則結(jié)果為真,否則結(jié)果為假1>=2或1.>=(2)<=判斷左值是否小于等于右值,是則結(jié)果為真,否則結(jié)果為假1<=2或1.<=(2)==判斷左值是否等于右值,是則結(jié)果為真,否則結(jié)果為假1==2或1.==(2)!=判斷左值是否不等于右值,是則結(jié)果為真,否則結(jié)果為假1!=2或1.!=(2)使用運(yùn)算符
運(yùn)算符意義示例邏輯運(yùn)算符&&若兩個(gè)條件成立則結(jié)果為真,否則結(jié)果為假1>2&&2>3或1>2.&&(2>3)||若兩個(gè)條件有一個(gè)成立則結(jié)果為真,否則結(jié)果為假1>2||2>3或1>2.||(2>3)!對(duì)當(dāng)前結(jié)果取反!(1>2)位運(yùn)算符&參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行&運(yùn)算,兩位同時(shí)結(jié)果為1結(jié)果才為1,否則為00&1或0.&(1)|參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行|運(yùn)算,兩位只要有一個(gè)為1則結(jié)果為10|1或0.|(1)^參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行^運(yùn)算,兩位不同時(shí)結(jié)果為1,相同時(shí)結(jié)果為00^1或0.^(1)使用運(yùn)算符
運(yùn)算符意義示例賦值運(yùn)算符=將右側(cè)的值賦于左側(cè)vala=2+=執(zhí)行加法后再賦值左側(cè)a+=2?=執(zhí)行減法后再賦值左側(cè)a
=1*=執(zhí)行乘法后再賦值左側(cè)a*=2/=執(zhí)行除法后再賦值左側(cè)a/=3%=執(zhí)行取余后再賦值左側(cè)a%=5<<=左移位后賦值左側(cè)a<<=2>>=右移位后賦值左側(cè)a>>=2&=按位&運(yùn)算后賦值左側(cè)a&=2|=按位|運(yùn)算后賦值左側(cè)a|=2^=按位^運(yùn)算后賦值左側(cè)a^=2數(shù)組是Scala中常用的一種數(shù)據(jù)結(jié)構(gòu),數(shù)組是一種存儲(chǔ)了相同類(lèi)型元素的固定大小的順序集合。Scala定義一個(gè)數(shù)組的語(yǔ)法格式如下。#第1種方式vararr:Array[String]=newArray[String](num)#第2種方式vararr:Array[String]=Array(元素1,元素2,…)定義與使用數(shù)組數(shù)組常用的方法定義與使用數(shù)組方法描述length返回?cái)?shù)組的長(zhǎng)度head查看數(shù)組的第一個(gè)元素tail查看數(shù)組中除了第一個(gè)元素外的其他元素isEmpty判斷數(shù)組是否為空contains(x)判斷數(shù)組是否包含元素x數(shù)組的使用Scala可以使用range()方法創(chuàng)建區(qū)間數(shù)組。使用range()方法前同樣需要先通過(guò)命令“importArray._”導(dǎo)入包。定義與使用數(shù)組函數(shù)是Scala的重要組成部分,Scala作為支持函數(shù)式編程的語(yǔ)言,可以將函數(shù)作為對(duì)象.定義函數(shù)的語(yǔ)法格式如下。deffunctionName(參數(shù)列表):[returntype]={}Scala提供了多種不同的函數(shù)調(diào)用方式,以下是調(diào)用函數(shù)的標(biāo)準(zhǔn)格式。functionName(參數(shù)列表)如果函數(shù)定義在一個(gè)類(lèi)中,那么可以通過(guò)“類(lèi)名.方法名(參數(shù)列表)”的方式調(diào)用。定義與使用函數(shù)匿名函數(shù)即在定義函數(shù)時(shí)不給出函數(shù)名的函數(shù)。Scala中匿名函數(shù)是使用箭頭“=>”定義的,箭頭的左邊是參數(shù)列表,箭頭的右邊是表達(dá)式,表達(dá)式將產(chǎn)生函數(shù)的結(jié)果。通常可以將匿名函數(shù)賦值給一個(gè)常量或變量,再通過(guò)常量名或變量名調(diào)用該函數(shù)。若函數(shù)中的每個(gè)參數(shù)在函數(shù)中最多只出現(xiàn)一次,則可以使用占位符“_”代替參數(shù)。定義與使用函數(shù)1.匿名函數(shù)高階函數(shù)指的是操作其他函數(shù)的函數(shù)。高階函數(shù)可以將函數(shù)作為參數(shù),也可以將函數(shù)作為返回值。高階函數(shù)經(jīng)常將只需要執(zhí)行一次的函數(shù)定義為匿名函數(shù)并作為參數(shù)。一般情況下,匿名函數(shù)的定義是“參數(shù)列表=>表達(dá)式”。由于匿名參數(shù)具有參數(shù)推斷的特性,即推斷參數(shù)的數(shù)據(jù)類(lèi)型,或根據(jù)表達(dá)式的計(jì)算結(jié)果推斷返回結(jié)果的數(shù)據(jù)類(lèi)型,因此定義高階函數(shù)并使用匿名函數(shù)作為參數(shù)時(shí),可以簡(jiǎn)化匿名函數(shù)的寫(xiě)法。定義與使用函數(shù)2.高階函數(shù)—函數(shù)作為參數(shù)高階函數(shù)可以產(chǎn)生新的函數(shù),并將新的函數(shù)作為返回值。定義高階函數(shù)計(jì)算矩形的周長(zhǎng),該函數(shù)傳入一個(gè)Double類(lèi)型的值作為參數(shù),返回以一個(gè)Double類(lèi)型的值作為參數(shù)的函數(shù),如下圖。定義與使用函數(shù)3.高階函數(shù)—函數(shù)作為返回值函數(shù)柯里化是指將接收多個(gè)參數(shù)的函數(shù)變換成接收單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),新的函數(shù)返回一個(gè)以原函數(shù)余下的參數(shù)為參數(shù)的函數(shù)。定義兩個(gè)整數(shù)相加的函數(shù),一般函數(shù)的寫(xiě)法及其調(diào)用方式如下圖。使用函數(shù)柯里化定義與使用函數(shù)4.函數(shù)柯里化實(shí)現(xiàn)手機(jī)號(hào)碼類(lèi)型識(shí)別,首先用數(shù)組存儲(chǔ)各種類(lèi)型的手機(jī)號(hào)碼段,并編寫(xiě)一個(gè)函數(shù)識(shí)別手機(jī)號(hào)碼類(lèi)型。用數(shù)組分別存儲(chǔ)各種類(lèi)型的手機(jī)號(hào)碼段。定義一個(gè)函數(shù)identify識(shí)別手機(jī)號(hào)碼段,并使用該函數(shù)查詢手機(jī)號(hào)碼段為133的手機(jī)號(hào)碼類(lèi)型。任務(wù)實(shí)現(xiàn)1定義函數(shù)識(shí)別號(hào)碼類(lèi)型目錄安裝與運(yùn)行Scala2統(tǒng)計(jì)廣州號(hào)碼段數(shù)量3根據(jù)歸屬地對(duì)手機(jī)號(hào)碼段進(jìn)行分組4編寫(xiě)手機(jī)號(hào)碼歸屬地信息查詢程序5手機(jī)號(hào)碼都有特定的歸屬地,因此可以通過(guò)手機(jī)號(hào)碼段的歸屬地統(tǒng)計(jì)某個(gè)地區(qū)的手機(jī)號(hào)碼段數(shù)量。某個(gè)地區(qū)的號(hào)碼段數(shù)量從某種意義上可以反映出該地區(qū)的人流量,該地區(qū)的手機(jī)號(hào)碼段數(shù)量大,說(shuō)明該地區(qū)的人流量也大。而人流量大的地區(qū)一般都是較為繁華的地區(qū),因此統(tǒng)計(jì)某個(gè)地區(qū)的號(hào)碼段數(shù)量從某個(gè)角度也可以反映該地區(qū)的繁華程度。本節(jié)的任務(wù)如下。以廣東地區(qū)的手機(jī)號(hào)碼為例,統(tǒng)計(jì)廣州號(hào)碼段的數(shù)量。任務(wù)描述在實(shí)際業(yè)務(wù)中,經(jīng)常需要對(duì)數(shù)據(jù)進(jìn)行過(guò)濾處理,使用if判斷即可滿足這個(gè)需求。Scala中的if判斷根據(jù)復(fù)雜程度可分為if語(yǔ)句、if…else語(yǔ)句、if…elseif…else語(yǔ)句、if…else嵌套語(yǔ)句,語(yǔ)法格式如下。#if語(yǔ)句if(布爾表達(dá)式){若布爾表達(dá)式為true,則執(zhí)行該語(yǔ)句塊}#if…else語(yǔ)句if(布爾表達(dá)式){若布爾表達(dá)式為true,則執(zhí)行該語(yǔ)句塊}else{若布爾表達(dá)式為false,則執(zhí)行該語(yǔ)句塊}使用if判斷#if…elseif…else語(yǔ)句if(布爾表達(dá)式1){
若布爾表達(dá)式1為true,則執(zhí)行該語(yǔ)句塊}elseif(布爾表達(dá)式2){
若布爾表達(dá)式2為true,則執(zhí)行該語(yǔ)句塊}elseif(布爾表達(dá)式3){
若布爾表達(dá)式3為true,則執(zhí)行該語(yǔ)句塊}else{
若以上布爾表達(dá)式都為false,則執(zhí)行該語(yǔ)句塊使用if判斷#if…else嵌套語(yǔ)句if(布爾表達(dá)式1){if(布爾表達(dá)式2){若布爾表達(dá)式2為true,則執(zhí)行該語(yǔ)句塊
}elseif(布爾表達(dá)式3){若布爾表達(dá)式3為true,則執(zhí)行該語(yǔ)句塊
}else{若布爾表達(dá)式2為false且布爾表達(dá)式3為false,則執(zhí)行該語(yǔ)句塊
}}else{若以上條件都為false,則執(zhí)行該語(yǔ)句塊}使用if判斷循環(huán)是指在某種條件下將一段代碼按順序重復(fù)執(zhí)行。在Scala中有3種循環(huán)結(jié)構(gòu),分別為while循環(huán)、do…while循環(huán)和for循環(huán)。for循環(huán)是相對(duì)較為常用的一種循環(huán),for循環(huán)語(yǔ)法格式如下。for(變量<-集合){循環(huán)語(yǔ)句}多重循環(huán)是常見(jiàn)的for循環(huán),多重循環(huán)也稱為for循環(huán)嵌套,是指在兩個(gè)或多個(gè)區(qū)間內(nèi)循環(huán)反復(fù),多個(gè)循環(huán)區(qū)間用分號(hào)隔開(kāi)。Scala可以在for循環(huán)中使用if判斷過(guò)濾一些元素,多個(gè)過(guò)濾條件用分號(hào)隔開(kāi)。使用for循環(huán)for循環(huán)使用yield可以將返回值作為一個(gè)變量存儲(chǔ),語(yǔ)法格式如下。varretVar=for(varx<-List;ifcondition1;ifcondition2…)yieldxretVar是變量名,for關(guān)鍵字后的括號(hào)用于指明變量和條件,而yield會(huì)將每一次循環(huán)得到的返回值保存在一個(gè)集合中,循環(huán)結(jié)束后將返回該集合,并賦值給變量retVar。使用yield對(duì)1~10的偶數(shù)進(jìn)行記錄,并保存至變量even中,如下圖。使用for循環(huán)本小節(jié)還沒(méi)有介紹使用Scala讀取文件的方法,因此要實(shí)現(xiàn)廣州號(hào)碼段數(shù)量的統(tǒng)計(jì)可以先從原始數(shù)據(jù)中取出部分?jǐn)?shù)據(jù)進(jìn)行測(cè)試。定義函數(shù)count(area:String)統(tǒng)計(jì)廣州號(hào)碼段數(shù)量,首先使用一個(gè)數(shù)組存儲(chǔ)數(shù)據(jù),初始化sum為0,再遍歷該數(shù)組,判斷數(shù)組中的元素是否包含參數(shù)area,若是則sum加1。調(diào)用并執(zhí)行count(“廣州”)函數(shù),結(jié)果如下圖。任務(wù)實(shí)現(xiàn)1定義函數(shù)識(shí)別號(hào)碼類(lèi)型目錄安裝與運(yùn)行Scala2統(tǒng)計(jì)廣州號(hào)碼段數(shù)量3根據(jù)歸屬地對(duì)手機(jī)號(hào)碼段進(jìn)行分組4編寫(xiě)手機(jī)號(hào)碼歸屬地信息查詢程序5本節(jié)的任務(wù)是篩選某個(gè)地區(qū)的所有手機(jī)號(hào)碼段。首先需要根據(jù)地區(qū)對(duì)手機(jī)號(hào)碼段進(jìn)行分組。再根據(jù)地區(qū)取出該分組內(nèi)的所有手機(jī)號(hào)碼段。任務(wù)描述Scala的列表(List)與數(shù)組非常相似,列表的所有元素都具有相同的類(lèi)型。與數(shù)組不同的是,列表是不可變的,即列表的元素不能通過(guò)賦值進(jìn)行更改。定義列表時(shí),需要寫(xiě)明列表元素的數(shù)據(jù)類(lèi)型,或者根據(jù)列表初值類(lèi)型自動(dòng)推斷。具有類(lèi)型T的元素的列表類(lèi)型可寫(xiě)為L(zhǎng)ist[T]。構(gòu)造列表的兩個(gè)基本單位是“Nil”和“::”?!癗il”可以表示空列表;“::”稱為中綴操作符,表示列表從前端擴(kuò)展,遵循右結(jié)合。定義與使用列表列表操作常用方法定義與使用列表方法描述defhead:A獲取列表的第一個(gè)元素definit:List[A]返回所有元素,除了最后一個(gè)元素deflast:A獲取列表的最后一個(gè)元素deftail:List[A]返回所有元素,除了第一個(gè)元素def:::(prefix:List[A]):List[A]在列表開(kāi)頭添加指定列表的元素deftake(n:Int):List[A]獲取列表前n個(gè)元素defcontains(elem:Any):Boolean判斷列表是否包含指定元素Scala中常用的查看列表元素的方法有head、init、last、tail和take()。head:查看列表的第一個(gè)元素。tail:查看第一個(gè)元素之后的其余元素。last:查看列表的最后一個(gè)元素。Init:查看除最后一個(gè)元素外的所有元素。take():查看列表前n個(gè)元素。定義與使用列表如果需要合并兩個(gè)列表,那么可以使用:::()。但需要注意,“列表1:::列表2”與“列表1.:::(列表2)”的結(jié)果是不一樣的,對(duì)于前者,列表2的元素添加在列表1的后面;對(duì)于后者,列表2的元素添加在列表1的前面。合并兩個(gè)列表還可以使用concat()方法。用戶可以使用contains()方法判斷列表中是否包含某個(gè)元素,若列表中存在指定的元素則返回true,否則返回false。定義與使用列表ScalaSet(集合)是沒(méi)有重復(fù)的對(duì)象集合,所有的元素都是唯一的。集合操作常用方法Scala合并兩個(gè)列表時(shí)使用的是:::()或concat()方法,而合并兩個(gè)集合使用的是++()方法。定義與使用集合方法描述defhead:A獲取集合的第一個(gè)元素definit:Set[A]返回所有元素,除了最后一個(gè)deflast:A獲取集合的最后一個(gè)元素deftail:Set[A]返回所有元素,除了第一個(gè)def++(elems:A):Set[A]合并兩個(gè)集合deftake(n:Int):List[A]獲取列表前n個(gè)元素defcontains(elem:Any):Boolean判斷集合中是否包含指定元素映射(Map)是一種可迭代的鍵值對(duì)結(jié)構(gòu)。所有的值都可以通過(guò)鍵來(lái)獲取,并且映射中的鍵都是唯一的。集合操作常用方法同樣也適合映射。另外映射還可以通過(guò)keys方法獲取所有的鍵,通過(guò)values方法獲取所有值,也可以通過(guò)isEmpty方法判斷映射的數(shù)據(jù)是否為空定義與使用映射元組(Tuple)是一種類(lèi)似于列表的結(jié)構(gòu),但與列表不同的是,元組可以包含不同類(lèi)型的元素。元組的值是通過(guò)將單個(gè)的值包含在圓括號(hào)中構(gòu)成的。目前,Scala支持的元組最大長(zhǎng)度為22,即Scala元組最多只能包含22個(gè)元素。訪問(wèn)元組元素可以通過(guò)“元組名稱._元素索引”進(jìn)行,索引從1開(kāi)始。定義與使用元組map()方法可通過(guò)一個(gè)函數(shù)重新計(jì)算列表中的所有元素,并且返回一個(gè)包含相同數(shù)目元素的新列表。foreach()方法和map()方法類(lèi)似,但是foreach()方法沒(méi)有返回值,只用于對(duì)參數(shù)的結(jié)果進(jìn)行輸出。用函數(shù)組合器filter()方法可以移除傳入函數(shù)的返回值為false的元素。flatten()方法可以將嵌套的結(jié)構(gòu)展開(kāi),即flatten()方法可以將一個(gè)二維的列表展開(kāi)成一個(gè)一維的列表。用函數(shù)組合器flatMap()方法結(jié)合了map()方法和flatten()方法的功能,接收一個(gè)可以處理嵌套列表的函數(shù),再對(duì)返回結(jié)果進(jìn)行連接。groupBy()方法可對(duì)集合中的元素進(jìn)行分組操作,返回的結(jié)果是一個(gè)映射。用函數(shù)組合器實(shí)現(xiàn)根據(jù)歸屬地對(duì)手機(jī)號(hào)碼段進(jìn)行分組,需要先將數(shù)據(jù)存儲(chǔ)至列表中,使用groupBy()方法對(duì)列表中的元素進(jìn)行分組。從原始數(shù)據(jù)中抽取4條數(shù)據(jù),并存放至列表phone中,使用groupBy()方法根據(jù)歸屬地對(duì)列表中的元素進(jìn)行分組。任務(wù)實(shí)現(xiàn)1定義函數(shù)識(shí)別號(hào)碼類(lèi)型目錄安裝與運(yùn)行Scala2統(tǒng)計(jì)廣州號(hào)碼段數(shù)量3根據(jù)歸屬地對(duì)手機(jī)號(hào)碼段進(jìn)行分組4編寫(xiě)手機(jī)號(hào)碼歸屬地信息查詢程序5前面三節(jié)只抽取了部分?jǐn)?shù)據(jù)進(jìn)行操作,本節(jié)的任務(wù)如下。讀取文件中的所有數(shù)據(jù)。根據(jù)完整數(shù)據(jù)編寫(xiě)手機(jī)號(hào)碼歸屬地信息查詢程序。任務(wù)描述Scala是一種純粹的面向?qū)ο笳Z(yǔ)言,面向?qū)ο笳Z(yǔ)言有兩個(gè)重要的概念:類(lèi)和對(duì)象。其中,類(lèi)是對(duì)象的抽象,也可以把類(lèi)理解為模板,對(duì)象才是真正的實(shí)體。一般定義類(lèi)的格式如下。classClassName(參數(shù)列表)extendst{}一個(gè)Scala源文件中可以有多個(gè)類(lèi),并且Scala類(lèi)可以有參數(shù)。一般,Scala類(lèi)名的第一個(gè)字母需要大寫(xiě),如果需要使用幾個(gè)單詞構(gòu)成一個(gè)類(lèi)的名稱,那么每個(gè)單詞的第一個(gè)字母都要大寫(xiě)。與Java等其他語(yǔ)言不同的是,Scala中的類(lèi)不定義為public。定義Scala類(lèi)Scala類(lèi)繼承一個(gè)類(lèi)時(shí)需要使用關(guān)鍵字extends。Scala只允許繼承一個(gè)父類(lèi),并且繼承父類(lèi)的所有屬性和方法。子類(lèi)繼承父類(lèi)中已經(jīng)實(shí)現(xiàn)的方法時(shí),需要使用override關(guān)鍵字,子類(lèi)繼承父類(lèi)中未實(shí)現(xiàn)的方法時(shí),可以不用override關(guān)鍵字。定義Scala類(lèi)Scala中沒(méi)有static關(guān)鍵字,因此Scala的類(lèi)中不存在靜態(tài)成員。但是Scala可以使用object關(guān)鍵字實(shí)現(xiàn)單例模式。Scala中使用單例模式時(shí)需要使用object定義一個(gè)單例對(duì)象(object對(duì)象),單例對(duì)象在整個(gè)程序中只有一個(gè)實(shí)例。單例對(duì)象與類(lèi)的區(qū)別在于單例對(duì)象不能帶參數(shù)。定義單例對(duì)象的語(yǔ)法如下。objectObjectName{}使用Scal
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中長(zhǎng)期的借款合同
- 展覽館管理合作協(xié)議
- 新材料研發(fā)與應(yīng)用在制造業(yè)中的推廣方案設(shè)計(jì)
- 農(nóng)村電商農(nóng)村電商國(guó)際合作與交流方案
- 環(huán)保科技在水資源管理中的應(yīng)用合作協(xié)議
- 保證金質(zhì)押擔(dān)保協(xié)議書(shū)
- 房屋租賃合同三方協(xié)議
- 可再生能源設(shè)備采購(gòu)合同
- 項(xiàng)目季度工作總結(jié)與前景展望報(bào)告
- 大數(shù)據(jù)平臺(tái)開(kāi)發(fā)協(xié)議
- 《生物經(jīng)濟(jì)學(xué)》課程教學(xué)大綱
- 2018中國(guó)技能?賽全國(guó)選拔賽“3D數(shù)字游戲藝術(shù)”項(xiàng)?技能樣題
- 家庭清潔課件教學(xué)課件
- 2024-2025學(xué)年北師版八年級(jí)生物上學(xué)期 第18章 生物圈中的微生物(知識(shí)清單)
- 2024年重慶客運(yùn)駕駛員考試卷及答案
- API設(shè)計(jì)與文檔規(guī)范
- 物流無(wú)人機(jī)垂直起降場(chǎng)選址與建設(shè)規(guī)范
- 2024年綠化工職業(yè)技能理論知識(shí)考試題庫(kù)(含答案)
- JT-T-775-2016大跨度斜拉橋平行鋼絲拉索
- 醫(yī)學(xué)檢驗(yàn)技術(shù)專業(yè)《血液學(xué)檢驗(yàn)》課程標(biāo)準(zhǔn)
- 2024年高考改革新方案
評(píng)論
0/150
提交評(píng)論