scala語言基礎 一文帶你熟悉六大資料結構

2021-10-06 02:19:14 字數 4242 閱讀 5775

scala語言的資料結構基礎,涵蓋陣列、列表、元組、集、對映、迭代器等。

陣列是程式設計中經常用到的資料結構,一般包括定長陣列和變長陣列。本教程旨在快速掌握最基礎和常用的知識,因此,只介紹定長陣列。

定長陣列,就是長度不變的陣列,在scala中使用array進行宣告,如下:

val intvaluearr = new array[int](3)  //宣告乙個長度為3的整型陣列,每個陣列元素初始化為0

intvaluearr(0) = 12 //給第1個陣列元素賦值為12

intvaluearr(1) = 45  //給第2個陣列元素賦值為45

intvaluearr(2) = 33 //給第3個陣列元素賦值為33

需要注意的是,在scala中,對陣列元素的應用,是使用圓括號,而不是方括號。而實際上,scala提供了更加簡潔的陣列宣告和初始化方法,如下:

val intvaluearr = array(12,45,33)

val mystrarr = array("bigdata","hadoop","spark")

從上面**可以看出,都不需要給出陣列型別,scala會自動根據提供的初始化資料來推斷出陣列的型別。

下面我們首先宣告乙個列表:

val intlist = list(1,2,3)
列表有頭部和尾部的概念,可以使用intlist.head來獲取上面定義的列表的頭部,值是1,使用intlist.tail來獲取上面定義的列表的尾部,值是list(2,3),可以看出,頭部是乙個元素,而尾部則仍然是乙個列表。

由於列表的頭部是乙個元素,所以,我們可以使用::操作,在列表的頭部增加新的元素,得到乙個新的列表,如下:

val intlist = list(1,2,3)

val intlistother = 0::intlist

注意,上面操作執行後,intlist不會發生變化,依然是list(1,2,3),intlistother是乙個新的列表list(0,1,2,3)

::操作符是右結合的,因此,如果要構建乙個列表list(1,2,3),實際上也可以採用下面的方式:

val intlist = 1::2::3::nil
上面**中,nil表示空列表。

我們也可以使用:::操作符對不同的列表進行連線得到新的列表,比如:

val intlist1 = list(1,2)

val intlist2 = list(3,4)

val intlist3 = intlist1:::intlist2

元組是不同型別的值的聚集。元組和列表不同,列表中各個元素必須是相同型別,而元組可以包含不同型別的元素。

下面我們宣告乙個名稱為tuple的元組(為了看到宣告後的效果,我們這次在scala直譯器中輸入**並執行):

scala> val tuple = ("bigdata",2015,45.0)

tuple: (string, int, double) = (bigdata,2015,45.0)  //這行是scala直譯器返回的執行結果

scala> println(tuple._1)

bigdata

scala> println(tuple._2)

2015

scala> println(tuple._3)

45.0

從上述**在scala直譯器中的執行效果可以看出,我們宣告乙個元組是很簡單的,只需要用圓括號把多個元組的元素包圍起來就可以了。

當需要訪問元組中的某個元素的值時,可以通過類似tuple._1、tuple._2、tuple._3這種方式就可以實現。

集(set)是不重複元素的集合。列表中的元素是按照插入的先後順序來組織的,但是,」集」中的元素並不會記錄元素的插入順序,而是以「雜湊」方法對元素的值進行組織,所以,它允許你快速地找到某個元素。

集包括可變集和不可變集,預設情況下建立的是不可變集,通常我們使用不可變集。

下面我們用預設方式建立乙個不可變集,如下(在scala直譯器中執行):

scala> var myset = set("hadoop","spark")

myset: scala.collection.immutable.set[string] = set(hadoop, spark)

scala> myset += "scala"  //向myset中增加新的元素

scala> println(myset.contains("scala"))

true

上面宣告時,如果使用val,myset += 「scala」執行時會報錯,所以需要宣告為var。(如果要宣告乙個可變集,則需要引入scala.collection.mutable.set包)

在scala中,對映(map)是一系列鍵值對的集合,也就是,建立了鍵和值之間的對應關係。在對映中,所有的值,都可以通過鍵來獲取。

對映包括可變和不可變兩種,預設情況下建立的是不可變對映,如果需要建立可變對映,需要引入scala.collection.mutable.map包。

下面我們建立乙個不可變對映:

val university = map("xmu" -> "xiamen university", "thu" -> "tsinghua university","pku"->"peking university")
如果要獲取對映中的值,可以通過鍵來獲取,如下:

println(university("xmu"))
上面**通過」xmu」這個鍵,可以獲得值xiamen university。

如果要檢查對映中是否包含某個值,可以使用contains方法,如下:

val xmu = if (university.contains("xmu")) university("xmu") else 0

println(xmu)

迴圈遍歷對映,是經常需要用到的操作,基本格式是:

for ((k,v)
下面給出乙個例項:

for ((k,v)
在scala中,迭代器(iterator)不是乙個集合,但是,提供了訪問集合的一種方法。當構建乙個集合需要很大的開銷時(比如把乙個檔案的所有行都讀取記憶體),迭代器就可以發揮很好的作用。

迭代器包含兩個基本操作:next和hasnext。next可以返回迭代器的下乙個元素,hasnext用於檢測是否還有下乙個元素。

有了這兩個基本操作,我們就可以順利地遍歷迭代器中的所有元素了。

通常可以通過while迴圈或者for迴圈實現對迭代器的遍歷。

while迴圈如下:

val iter = iterator("hadoop","spark","scala")

while (iter.hasnext) 

注意,上述操作執行結束後,迭代器會移動到末尾,就不能再使用了,如果繼續執行一次println(iter.next)就會報錯。另外,上面**中,使用iter.next和iter.next()都是可以的,但是,hasnext後面不能加括號。

for迴圈如下:

val iter = iterator("hadoop","spark","scala")

for (elem 

媽媽再也不用擔心雙系統安裝了!

spark機器學習:模型評估指標

spark機器學習:頻繁模式挖掘

爬蟲實戰:selenium爬取京東商品

爬蟲實戰:豆瓣電影top250爬取

爬蟲實戰:scrapy框架爬取qq**

資料分析與挖掘

資料結構與演算法

機器學習與大資料元件

歡迎關注,感謝「在看」,隨緣稀罕~

一文帶你讀懂「TRIZ」

各位好,本期的內容是 triz與經典triz 在開始之前,請您先嘗試回答以下問題 什麼是triz?什麼是 經典triz 經典triz 包括哪些內容?經典triz 與 現代triz 的區別?您可以先思考一會兒。好了,不知您回答對了幾道題呢?為什麼要學習本課程?學習本課程,你可以獲得哪些知識?在此,我要...

期末 一文帶你系統回顧C 語言

c 語言是一種底層語言,是一種系統底層級的語言,例如windows linux unix等作業系統就是使用c語言編寫的。所以由此看來,不論是火爆了25年的j a,還是近年來愈來愈流行的python,它們雖外表光鮮亮麗,但c語言就是內在的靈魂,樸實無華。c 語言既然這麼重要,但是它有什麼值得我們去學的...

一文帶你搞懂Spring核心

容錯 減少延遲 提高效能 可用性負載均衡 總而言之,其實目的只有乙個,使用者體驗 分布式系統是由使用分發中介軟體連線的自治計算機組成的網路。它們有助於共享不同的資源和功能,為使用者提供單一且整合的連貫網路。1 在伺服器 虛擬機器 上安裝zookeeper 我這裡使用docker安裝 1 去docke...