Scala學習文件 列表的使用

2022-03-18 15:02:22 字數 4551 閱讀 1262

注:列表是不可變的,不能通過賦值改變列表的元素

列表具有遞迴結構,陣列是連續的

scala裡的列表型別是協變的

--> scala中的逆變與協變

分治原則

//自定義實現:::操作符

xs match

}

//自定義實現reverse函式

def rev[t](xs:list[t]):list[t]=

}

字首與字尾:drop、take、splitat

xs take  n 返回列表前n個元素

xs drop n 返回列表除了前n個元素之外的所有元素

xs splitat n 在指定位置拆分列表 

元素選擇

在list中不常使用隨機元素訪問,因為xs(n)花費的時間與索引值n成正比。

顯示列表

tostring方法、mkstring方法

轉換列表

elements、toarray、copytoarray

val arr = abced.toarray //

arr為陣列

arr.tostring

arr.tolist  

//陣列轉換為列表

list類的高階方法

1.列表間對映 map, flatmap, foreach

li map fun:以型別為list[t]的列表xs和型別為t=>u的函式為操作元,返回把函式fun應用在li的每個元素之後由此組成的新列表

val l1 =list(1,2,3)map(_+1)        //

list(1,2,3)map(x=>x+1)

結果:res0: list[int] = list(2, 3, 4)

val words = list("the","quick","brown","fox");

println(words.map(_.length))

結果:list(3, 5, 5, 3)

flatmap操作符與map類似,不過它的右操作符能夠返回元素列表的函式,對列表每個元素呼叫該方法,然後連線所有方法的結果並返回

val words = list("the","quick","brown","fox");

println(words.map(_.tolist))

println(words.flatmap(_.tolist))

結果:  list(list(t, h, e), list(q, u, i, c, k), list(b, r, o, w, n), list(f, o, x))

list(t, h, e, q, u, i, c, k, b, r, o, w, n, f, o, x)

foreach 右操作元是過程(返回型別是unit的函式),只對每個列表元素都呼叫一遍過程,操作結果仍然是unit,不產生結果列表

var sum:int=0list.range(1,5).foreach(x=>sum=sum+x)

結果:沒有返回值,但是sum=10

2.列表過濾

filter,partition, find, takewhile, dropwhile, span

filter:返回列表中符合論斷函式為true的所有元素組成的列表

list(1,2,3,4,5) filter(_%2==0)

結果:res0: list[int] = list(2, 4)

partirion:返回列表中符合論斷函式為false的所有元素組成的列表

find:返回列表中第乙個符合論斷函式為true的元素,返回為可選值

list(1,2,3,4,5)find(_%2==0)

結果:res0: option[int] = some(2)

takewhile,dropwhile:mylist takewhile p 返回列表mylist中最長能夠滿足p的字首,dropwhile移除mylist中能夠滿足p的字首

span:作用相當於組合了takewhile和dropwhile,返回一對列表。(和splitat組合了take和drop一樣)

list(1,2,3,4,-5,6,7) takewhile(_>0)    //

結果:res1: list[int] = list(1, 2, 3, 4)

list(1,2,3,4,-5,6,7) dropwhile(_>0) //

結果:res2: list[int] = list(-5, 6, 7)

list(1,2,3,4,-5,6,7) span (_>0)  //

結果:res3: (list[int], list[int]) = (list(1, 2, 3, 4),list(-5, 6, 7))

3.列表的論斷:forall,exists

操作mylist forall p,如果列表的所有元素滿足p,返回true

操作mylist exists p,如果列表中存在乙個元素滿足p,返回true

4.摺疊列表 /:和:\

左摺疊操作(z /: li)(op)  與三個物件有關 開始值z,列表li,以及二元操作op,摺疊結果是op應用到字首z以及每個相鄰元素上

操作op必須以型別a和b的值為引數,並且返回型別為b的結果。  (z的型別為b,li的型別為a)

val z =1val a =(z/:list(1,2,3)) (_+_) //相當於+(+(+(z,1),2),3)    (z/:list(a,b,c)) (op) 等價於 op( op( op(z,a), b ), c )

結果a: int = 7

右邊摺疊操作(list(a,b,c) :\z)(op) 等價於op(a , op(b , op(c , z ) ) )

5.列表排序sort

list(1,-4,5,9,6,8).sort(_<_)

words.sort(_.length>_.length)

list物件的方法

前面是list類的方法,因為是在類的物件上對這些方法進行呼叫

有些方法是定義在list類的伴生物件中的,其中一些是建立列表的工廠方法,一些是對特定型別列表的操作

2.建立數值範圍

var li = list.range(1,5)    //

li =list(1,2,3,4) 尾部數值不在範圍內

var li2 = list.range(1,9,2)  //li2 =list(1,3,5,7,9) step數值作為第三引數

var li3 = list.range(9,1,-3)  //li3 =list(9,6,3)

3.建立統一的列表 make

var li = list.make(3,"hello")  //

li = list(hello,hello,hello)

4.解除嚙合列表 list.unzip

例子:

val li1 = list("a","b","c","d")

val li2 = list(1,2,3,4,5,6)

val s =li1.zip(li2) //zip把兩個列表組合成對偶列表

println(s)       //輸出list((a,1), (b,2), (c,3), (d,4))

val (s1,s2) =list.unzip(s)  //把對偶列表還原為兩個列表 也可以用s.unzip,若s列表的元素不是列表,就不行。

println(s1)       //輸出list(a, b, c, d)

println(s2)       //輸出list(1, 2, 3, 4)

5.連線列表 list.flatten list.concat

flatten方法以列表內的列表作為引數,並且把所有的元素列表連線在一起。 

concat方法連線多個元素列表,數目不限

var xss = list(list("a","b"),list("y","z"))

println(xss.flatten)      //

list(a, b, y, z)

println(list.concat(l1,l3))  //list(1, 2, 3, 4, 111, 52)

6.對映及測試配對列表 list.map2 list.forall2 list.exists2

scala2.11.4沒有發現,近似功能函式待補充

Scala學習文件 各種使用模式的情況

模式在變數定義中 在定義val或者var的時候,可以使用模式替代簡單的識別符號,如可以使用模式拆分元組,並把每個值分配給變數 val mytuple 123,abc var num,str mytuple 如此,num 123,str abc 如果知道正在使用的樣本類的精確結構,可以使用模式結構它 ...

Git學習文件

git本地版本維護基本操作 git 本地倉庫 維護三棵樹 工作區 暫存區 head 工作區 當前 工作環境 暫存區 通過git add將 新增到暫存區 head 指向最新一次的提交 git status 檢視修改的檔案狀態 git add 把修改提交到暫存區 git commit m comment...

Angular js 學習文件

angular js 指令 ng init key value 在其中使用鍵值對定義資料 在html中使用key呼叫資料 ng model 把元素值繫結到應用程式 一般出現在文字框中 定義key 然後把輸入的值顯示 ng model同樣可以為應用程式資料提供型別驗證 為應用程式提供狀態 為html元...