1. 程式人生 > >Scala基礎入門教程(三)

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是一個不可改變值的集合

我們在學習大資料的時候,裡面用到的集合都是不可修改的,修改就會產生新的物件,原物件是不允許被修改的。