天天看點

《Scala CookBook》Chapter11

List

2.1scala的List類是不可變的,大小及其中元素都不能修改。由連結清單實作,包含常用的head,tail,isEmpty方法。大多數在List上的操作都會涉及遞歸算法,将清單且分為頭部和尾部。

現在有一個需求:如果一個連結清單的順序是5,4,3,2,1。那麼怎麼才能不改變連結清單的情況下逆序列印出1,2,3,4,5.

答:可以使用遞歸解決這個問題。

(1)定義一個列印方法A,接收的參數是連結清單中的頭結點N1。

(2)傳傳入連結表頭結點H1

(3)将節點5之後的(4,3,2,1)作為一個新的連結清單,并将這個新連結清單的頭結點H2傳入方法A

(4)遞歸結束。

(5)方法A中的後面是列印出資訊

2.2想使用可變清單(相對于索引序列,是線性序列),但是List是不可變的,可以使用ListBuffer,在必要時可以将ListBuffer轉換為List。

2.3List是不可變的,如果建立要經常改變的清單,推薦使用ListBuffer.

2.4List是不可變的,不能從中删除元素,但是可以過濾掉不想要的元素,然後将結果賦給一個新的變量。

2.5合并或者連接配接清單

01.++

02.concat

03.:::方法

Stream

11.6使用List的懶惰版本,Stream

Stream和List很像,不同之處在于它的元素是惰性計算的【隻有元素被通路時才會計算】,和視圖建立惰性版本的集合類似。

1.建構Stream的方法

使用#::方法建構,表達式的結尾用Stream.empty代替Nil

val stream = 1 #:: 2 #:: 3 #:: 4 #:: Stream.empty

stream: scala.collection.immutable.Stream[Int] = Stream(1, ?)

顯示流開始于數字1,結尾用?表示。這是因為流的結尾還沒有執行。

2.對REPL的顯示進行說明

3.通路流的頭部元素和尾部元素

Array

11.7建立和更新數組【Array】的不同方式

01.可以建立具有初始值的數組。scala能夠隐式推斷數組類型。示例如下:

val arr = Array(“apple”,”google”,”alibaba”)

val arr = ArrayInt

val fruits = new ArrayString//定義一個數組初始大小和類型,随後填充。

02.Array類:數組是可變的,有序的集合。數組中的元素是可以修改的。數組是一種索引序列集合,根據索引位置直接而且快速地通路和修改值。

ArrayBuffer

11.8建立大小可變的數組(ArrayBuffer)

01.Array的内容是可變的,但是其大小不能改變。但是ArrayBuffer内容可變,大小亦可變。

02.往ArrayBuffer中添加元素的各種方法

03.需要導入包scala.collection.mutable.ArrayBuffer

11.9删除Array和ArrayBuffer的元素

01.從ArrayBuffer中删除元素的各種方法-=/–=/remove/clear

-=

–=

remove

clear

02.Array數組大小不能改變,是以不能直接删除元素。但是可以将元素從一個數組中過濾出去,然後将結果指派給新的數組。

11.10數組排序

1.sorted方法可以對具有Double,Float,Int和任何隐式scala.math.Ordering的其它類型集合進行排序。

sorted

2.如果想使用sorted方法排序Person類,隻需要把Ordered特質混入Person類。

3.sortWith可以傳遞函數【函數由簡單—>複雜】;sortWith可以對沒有Ordering的類型進行排序。例如:

class Person(var name:String){

override def toString = name

}