Scala基礎入門教程(三)
Tuples(元組):
在Python中的元組是不受限制的,在Scala中元組最多支援22項
因為在Scala中實際上是定義了22個類,分別是Tuple1,Tuple2,Tuple3一直到22個,
例子:
object Demo1 extends App{
val x = Tuple1(1,2)
println(x)
}
結果:
((1,2))
可以看見結果裡面是一個,而不是兩個,因為Tuple1裡面只有一個,就算你存兩個,也會把兩個放在一個裡面
例子:
object Demo1 extends App{ val x = Tuple2(1,2) println(x) } 結果: (1,2)
由上圖所見,建立了一個Tuple2的話,結果是存了兩個,以此類推。
那麼我們怎麼訪問裡面的資料呢?
println(x._2) //Tuple2中有_1和_2,其他也是一樣以此類推
結果:
2 //娶到了這個Tuple2中的第二個資料
我們剛才說了,Tuple中有22個類,1-22,可以點進去檢視為什麼是這樣:Tuple2只有兩個引數:_1 _2
那我們可以另一種方法建立:
object Demo1 extends App{
val a =(1,2,3)
println(a.getClass)
}
結果:
class scala.Tuple3
所以說在定義Tuple的時候沒必要寫Tuple幾,這樣比較靈活,但是要記住最多22個,Python中可以任意數量
那我們得到這個Tuple之後,我們如何迴圈遍歷呢:Tuple不是序列,不可以直接迴圈,本身是一個類,
你會發現 你用變數點不出來Foreach的
例子:
object Demo1 extends App{
val a =(1,2,3)
a.productIterator.foreach(println(_))
//必須使用productIterator轉換成一種可迭代的,再Foreach
}
結果:
1
2
3
那麼如果現在你想要對Tuple裡面每一項加1,你會發現直接+1是報錯的,因為Tuple不知道資料型別是什麼的,
例子:
val a = Tuple3[Int,String,Int](1,"2",3) //我們可以發現在定義Tuple可以定義裡面每一項的資料型別是什麼 a.productIterator.foreach(x=> println(x.toString.toInt+1)) //先定義x變數名,x是any型別,先轉成toString,再轉成toInt 結果: 2 3 4
再來看。如果想對Tuple進行拆箱怎麼做:具備拆箱的能力
val t = Tuple3[Int,String,Int](1,"2",3)
val(a,b,c)=t
println(b)
結果:
2
如果你想快速得到一個Tuple,可以如下:
val t = "cn"->"Chana"
println(t)
結果:
(cn,Chana)
集合:
再Scala中有兩種集合分類:
1可改變的(mutable )
2不可改變的(immutable ),都支援泛型,
體系結構:
Traversable:可以Foreash
Iterable:集合都可被迭代的
Seq:序列
Set:集合
Map:對映
那麼Seq,Set,Map還分成了具體的實現類:
如下是不可改變的實現類:
如下來實踐一下:Array
筆者這裡建立了個數組,但是和Java不一樣,因為我們沒有New一個數組,點進去檢視Array
有上圖我們可以看到,Array是以Object來定義的,Object定義的東西都不需要New就可以使用的,我們就可以往裡面傳資料了
為什麼能傳資料了?
如上圖,它已經幫我們構建了各種型別的資料。
讓兩個Array連在一起:
var a = Array(1,3,5,8)
var b = Array(2,4,6,7)
val l =List.concat(a,b) //concat是一個連線,它的引數是動態的
println(l)
結果:
List(1, 3, 5, 8, 2, 4, 6, 7)
除了用List中concat連線,也可以有別的方法:
var a = Array(1,3,5,8)
var b = Array(2,4,6,7)
//val l =List.concat(a,b) //concat是一個連線,它的引數是動態的
val l =a++b
l.foreach(println(_)) //直接列印可以看見是個陣列型別,但是沒有轉換成List
結果:
1
3
5
8
2
4
6
7
總結:
我們使用List.concat是產生了一個List
我們使用 ++ 的時候是產生了第三個陣列
有了陣列和List我們可以做什麼呢?
排序:
var a = Array(1,3,5,8)
var b = Array(2,4,6,7)
val l =a++b
l.sorted.foreach(println(_))//排序 如果直接寫sorted的話預設是升序
結果:
1
2
3
4
5
6
7
8
排序後進行分片(slice),取自己想要的資料
var a = Array(1,3,5,8)
var b = Array(2,4,6,7)
val l =a++b
l.sorted.reverse.slice(2,4).foreach(println(_))
//取到下表為包含2和不包含4的資料 半開半閉
練習:SortBy
var a = List(("a",4),("b",2),("c",3))//複合型資料
a.foreach(println(_))
結果:
(a,4)
(b,2)
(c,3)
//結果和我們寫的順序是一樣的
排序:按後一項排序
var a = List(("a",4),("b",2),("c",3))//複合型資料
a.sortBy(_._2).foreach(println(_))
結果:
(b,2)
(c,3)
(a,4)
練習:SortWith
>號是根據第二個降序, <號是根據第二個升序的意思
得到一個有十個數的List,每三個數分一組
val a = (1 to 10 ).toList
val g =a grouped 3 //類似於分頁
// Scala中呼叫函式可以不用點 如果你想點的話: val g = a.grouped(3)
g.foreach(println(_))
結果:
List(1, 2, 3)
List(4, 5, 6)
List(7, 8, 9)
List(10) //多的一個就自己一組了
集合操作符:
注意: :號必須要在集合的那一方
結果:
++和 =:的使用
如果說是 +:的話
+= 這裡的追加是在原物件進行修改,為什麼不用List,因為你點進去可以看到,List是一個不可改變值的集合
我們在學習大資料的時候,裡面用到的集合都是不可修改的,修改就會產生新的物件,原物件是不允許被修改的。