Scala中使用List
10年積累的成都網(wǎng)站設(shè)計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有武寧免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
Scala是函數(shù)式風(fēng)格與面向?qū)ο蠊泊娴木幊陶Z言,方法不應(yīng)該有副作用是函數(shù)風(fēng)格編程的一個重要的理念。方法唯一的效果應(yīng)該是計算并返回值,用這種方式工作的好處就是方法之間很少糾纏在一起,因此就更加可靠和可重用。另一個好處(靜態(tài)類型語言)是傳入傳出方法的所有東西都被類型檢查器檢查,因此邏輯錯誤會更有可能把自己表現(xiàn)為類型錯誤。把這個函數(shù)式編程的哲學(xué)應(yīng)用到對象世界里以為著使對象不可變。
前面一章介紹的Array數(shù)組是一個所有對象都共享相同類型的可變序列。比方說Array[String]僅包含String。盡管實例化之后你無法改變Array的長度。因此,Array是可變的對象。
說到共享相同類型的不可變對象類型,Scala的List類才是。和數(shù)組一樣,List[String]包含的僅僅是String。Scala的List不同于Java的java.util.List,總是不可變的(Java的List是可變)。更準(zhǔn)確的說法,Scala的List是設(shè)計給函數(shù)式風(fēng)格的編程用的。
(1)List類型定義以及List的特點:
//字符串類型List scala> val fruit=List("Apple","Banana","Orange") fruit: List[String] = List(Apple, Banana, Orange) //前一個語句與下面語句等同 scala> val fruit=List.apply("Apple","Banana","Orange") fruit: List[String] = List(Apple, Banana, Orange) //數(shù)值類型List scala> val nums=List(1,2,3,4,5) nums: List[Int] = List(1, 2, 3, 4, 5) //多重List,List的子元素為List scala> val list = List(List(1, 2, 3), List("adfa", "asdfa", "asdf")) list: List[List[Any]] = List(List(1, 2, 3), List(adfa, asdfa, asdf)) //遍歷List scala> for(i <- list; from=i; j<-from)println(j) 1 2 3 adfa asdfa asdf
(2)List與Array的區(qū)別:
1、List一旦創(chuàng)建,已有元素的值不能改變,可以使用添加元素或刪除元素生成一個新的集合返回。
如前面的nums,改變其值的話,編譯器就會報錯。而Array就可以成功
scala>nums(3)=4 <console>:10: error: value update is not a member of List[Int] nums(3)=4 ^
2、List具有遞歸結(jié)構(gòu)(Recursive Structure),例如鏈表結(jié)構(gòu)
List類型和氣他類型集合一樣,它具有協(xié)變性(Covariant),即對于類型S和T,如果S是T的子類型,則List[S]也是List[T]的子類型。
例如:
scala>var listStr:List[Object] = List("This", "Is", "Covariant", "Example") listStr:List[Object] = List(This, Is, Covariant, Example) //空的List,其類行為Nothing,Nothing在Scala的繼承層次中的最底層 //,即Nothing是任何Scala其它類型如String,Object等的子類 scala> var listStr = List() listStr:List[Nothing] = List() scala>var listStr:List[String] = List() listStr:List[String] = List()
(3)List常用構(gòu)造方法
//1、常用::及Nil進(jìn)行列表構(gòu)建 scala> val nums = 1 :: (2:: (3:: (4 :: Nil))) nums: List[Int] = List(1, 2, 3, 4) //由于::操作符的優(yōu)先級是從右向左的,因此上一條語句等同于下面這條語句 scala> val nums = 1::2::3::4::Nil nums:List[Int] = List(1, 2, 3, 4) 至于::操作符的使用將在下面介紹
(4)List常用操作
//判斷是否為空 scala> nums.isEmpty res5: Boolean = false //取第一個元素 scala> nums.head res6: Int = 1 //取列表第二個元素 scala>nums.tail.head res7: Int = 2 //取第三個元素 scala>nums.tail.tail.head res8: Int = 3 //插入操作 //在第二個位置插入一個元素 scala>nums.head::(3::nums.tail) res11: List[Int] = List(1, 3, 2, 3, 4) scala> nums.head::(nums.tail.head::(4::nums.tail.tail)) res12: List[Int] = List(1, 2, 4, 3, 4) //插入排序算法實現(xiàn) def isort(xs: List[Int]):List[Int] = { if(xs.isEmpty) Nil else insert(xs.head, issort(xs.tail)) } def insert(x:Int, xs:List[Int]):List[Int] = { if(xs.isEmpty || x <= xs.head) x::xs else xs.head :: insert(x, xs.tail) } //連接操作 scala>List(1, 2, 3):::List(4, 5, 6) res13: List[Int] = List(1, 2, 3, 4, 5, 6) //去除最后一個元素外的元素,返回的是列表 scala> nums.init res13: List[Int] = List(1, 2, 3) //取出列表最后一個元素 scala>nums.last res14: Int = 4 //列表元素倒置 scala> nums.reverse res15: List[Int] = List(4, 3, 2, 1) //一些好玩的方法調(diào)用 scala> nums.reverse.reverse == nums //丟棄前面n個元素 scala>nums drop 3 res16: List[Int] = List(4) //獲取前面n個元素 scala>nums take 1 res17: List[Int] = List[1] //將列表進(jìn)行分割 scala> nums.splitAt(2) res18: (List[Int], List[Int]) = (List(1, 2),List(3, 4)) //前一個操作與下列語句等同 scala> (nums.take(2),nums.drop(2)) res19: (List[Int], List[Int]) = (List(1, 2),List(3, 4)) //Zip操作 scala> val nums=List(1,2,3,4) nums: List[Int] = List(1, 2, 3, 4) scala> val chars=List('1','2','3','4') chars: List[Char] = List(1, 2, 3, 4) //返回的是List類型的元組(Tuple),返回的元素個數(shù)與最小的List集合的元素個數(shù)一樣 scala> nums zip chars res20: List[(Int, Char)] = List((1,1), (2,2), (3,3), (4,4)) //List toString方法 scala> nums.toString res21: String = List(1, 2, 3, 4) //List mkString方法 scala> nums.mkString res22: String = 1234 //轉(zhuǎn)換成數(shù)組 scala> nums.toArray res23: Array[Int] = Array(1, 2, 3, 4)
(5)List伴生對象方法
//apply方法 scala> List.apply(1, 2, 3) res24: List[Int] = List(1, 2, 3) //range方法,構(gòu)建某一值范圍內(nèi)的List scala> List.range(2, 6) res25: List[Int] = List(2, 3, 4, 5) //步長為2 scala> List.range(2, 6,2) res26: List[Int] = List(2, 4) //步長為-1 scala> List.range(2, 6,-1) res27: List[Int] = List() scala> List.range(6,2 ,-1) res28: List[Int] = List(6, 5, 4, 3) //構(gòu)建相同元素的List scala> List.make(5, "hey") res29: List[String] = List(hey, hey, hey, hey, hey) //unzip方法 scala> List.unzip(res20) res30: (List[Int], List[Char]) = (List(1, 2, 3, 4),List(1, 2, 3, 4)) //list.flatten,將列表平滑成第一個無素 scala> val xss = | List(List('a', 'b'), List('c'), List('d', 'e')) xss: List[List[Char]] = List(List(a, b), List(c), List(d, e)) scala> xss.flatten res31: List[Char] = List(a, b, c, d, e) //列表連接 scala> List.concat(List('a', 'b'), List('c')) res32: List[Char] = List(a , b, c)
(6)::和:::操作符介紹
List中常用'::',發(fā)音為"cons"。Cons把一個新元素組合到已有元素的最前端,然后返回結(jié)果List。
scala> val twoThree = List(2, 3) scala> val oneTwoThree = 1 :: twoThree scala> oneTwoThree oneTwoThree: List[Int] = List(1, 2, 3)
上面表達(dá)式"1::twoThree"中,::是右操作數(shù),列表twoThree的方法??赡軙幸苫?。表達(dá)式怎么是右邊參數(shù)的方法,這是Scala語言的一個例外的情況:如果一個方法操作符標(biāo)注,如a * b,那么方法被左操作數(shù)調(diào)用,就像a.* (b)--除非方法名以冒號結(jié)尾。這種情況下,方法被右操作數(shù)調(diào)用。
List有個方法叫":::",用于實現(xiàn)疊加兩個列表。
scala> val one = List('A', 'B') val one = List('A', 'B') scala> val two = List('C', 'D') scala> one:::two res1: List[Char] = List(A, B, C, D)
下面是List的方法列表:
注意:
類List沒有提供append操作,因為隨著列表變長append的耗時將呈線性增長,而使用::做前綴則僅花費常量時間。如果你想通過添加元素來構(gòu)造列表,你的選擇是把它們前綴進(jìn)去,當(dāng)你完成之后再調(diào)用reverse;或使用ListBuffer,一種提供append操作的可變列表,當(dāng)你完成之后調(diào)用toList。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網(wǎng)頁標(biāo)題:Scala入門之List使用詳解
URL網(wǎng)址:http://aaarwkj.com/article18/jesigp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、定制網(wǎng)站、面包屑導(dǎo)航、品牌網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)