Scala列表

Scala 列表類似于數(shù)組桨醋,它們所有元素的類型都相同,但是它們也有所不同:列表是不可變的留荔,值一旦被定義了就不能改變,其次列表 具有遞歸的結(jié)構(gòu)(也就是鏈接表結(jié)構(gòu))而數(shù)組不是。聚蝶。
列表的元素類型 T 可以寫成 List[T]杰妓。例如,以下列出了多種類型的列表:

  // 字符串列表
  val site: List[String] = List("Runoob", "Google", "Baidu")

  // 整型列表
  val nums: List[Int] = List(1, 2, 3, 4)

// 空列表
  val empty: List[Nothing] = List()

// 二維列表
  val dim: List[List[Int]] = List( List(1, 0, 0), List(0, 1, 0), List(0, 0, 1) )

構(gòu)造列表的兩個基本單位是 Nil::
Nil 也可以表示為一個空列表碘勉。
以上實例我們可以寫成如下所示:

// 字符串列表
val site = "Runoob" :: ("Google" :: ("Baidu" :: Nil))

// 整型列表
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))

// 空列表
val empty = Nil

// 二維列表
val dim = (1 :: (0 :: (0 :: Nil))) :: (0 :: (1 :: (0 :: Nil))) :: (0 :: (0 :: (1 :: Nil))) :: Nil

列表基本操作

Scala列表有三個基本操作:
head :返回列表第一個元素
tail:返回一個列表巷挥,包含除了第一元素之外的其他元素
isEmpty: 在列表為空時返回true

對于Scala列表的任何操作都可以使用這三個基本操作來表達。實例如下:

object Test { 
    def main(args: Array[String]) {
         val site = "Runoob" :: ("Google" :: ("Baidu" :: Nil)) 
         val nums = Nil
         println( "第一網(wǎng)站是 : " + site.head )
         println( "最后一個網(wǎng)站是 : " + site.tail )
         println( "查看列表 site 是否為空 : " + site.isEmpty )
         println( "查看 nums 是否為空 : " + nums.isEmpty ) 
    }
}

執(zhí)行以上代碼验靡,輸出結(jié)果為:

$ vim Test.scala 
$ scala Test.scala 
第一網(wǎng)站是 : Runoob
最后一個網(wǎng)站是 : List(Google, Baidu)
查看列表 site 
是否為空 : false
查看 nums
是否為空 : true

連接列表
你可以使用 ::: 運算符或 List.:::() 方法或 List.concat() 方法來連接兩個或多個列表倍宾。實例如下:

object Test {
   def main(args: Array[String]) { 
          val site1 = "Runoob" :: ("Google" :: ("Baidu" :: Nil)) 
          val site2 = "Facebook" :: ("Taobao" :: Nil)
          // 使用 ::: 運算符
           var fruit = site1 ::: site2
           println( "site1 ::: site2 : " + fruit ) 
          // 使用 Set.:::() 方法 
           fruit = site1.:::(site2) 
           println( "site1.:::(site2) : " + fruit ) 
          // 使用 concat 方法 
           fruit = List.concat(site1, site2) 
           println( "List.concat(site1, site2) : " + fruit ) 
    }
}

執(zhí)行以上代碼,輸出結(jié)果為:

$ vim Test.scala 
$ scala Test.scala 
 site1 ::: site2 : List(Runoob, Google, Baidu, Facebook, Taobao)
 site1.:::(site2) : List(Facebook, Taobao, Runoob, Google, Baidu)
 List.concat(site1, site2) : List(Runoob, Google, Baidu, Facebook, Taobao)

List.fill()
我們可以使用 List.fill() 方法來創(chuàng)建一個指定重復數(shù)量的元素列表:

        object Test {
                def main(args: Array[String]) { 
                        val site = List.fill(3)("Runoob")
                       // 重復 Runoob 3次 
                      println( "site : " + site ) 
                      val num = List.fill(10)(2)
                   // 重復元素 2, 10 次
                   println( "num : " + num ) 
        }
  }

執(zhí)行以上代碼胜嗓,輸出結(jié)果為:

  $ vim Test.scala 
  $ scala Test.scala 
  site : List(Runoob, Runoob, Runoob)
  num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)

List.tabulate()

List.tabulate() 方法是通過給定的函數(shù)來創(chuàng)建列表高职。
方法的第一個參數(shù)為元素的數(shù)量,可以是二維的辞州,第二個參數(shù)為指定的函數(shù)怔锌,我們通過指定的函數(shù)計算結(jié)果并返回值插入到列表中,起始值為 0孙技,實例如下:

object Test { 
          def main(args: Array[String]) { 
              // 通過給定的函數(shù)創(chuàng)建 5 個元素 
              val squares = List.tabulate(6)(n => n * n) 
                println( "一維 : " + squares ) 
              // 創(chuàng)建二維列表 
              val mul = List.tabulate( 4,5 )( _ * _ )
             println( "多維 : " + mul ) 
      }
  }

執(zhí)行以上代碼产禾,輸出結(jié)果為:

$ vim Test.scala 
$ scala Test.scala 
一維 : List(0, 1, 4, 9, 16, 25)
多維 : List(List(0, 0, 0, 0, 0), List(0, 1, 2, 3, 4), List(0, 2, 4, 6, 8), List(0, 3, 6, 9, 12))

List.reverse
List.reverse 用于將列表的順序反轉(zhuǎn),實例如下:

        object Test { 
              def main(args: Array[String]) { 
                    val site = "Runoob" :: ("Google" :: ("Baidu" :: Nil))
                    println( "site 反轉(zhuǎn)前 : " + site ) 
                    println( "site 反轉(zhuǎn)前 : " + site.reverse )
           }
    }

執(zhí)行以上代碼牵啦,輸出結(jié)果為:

$ vim Test.scala
$ scala Test.scala 
site 反轉(zhuǎn)前 : List(Runoob, Google, Baidu)
site 反轉(zhuǎn)前 : List(Baidu, Google, Runoob)

Scala List 常用方法
下表列出了 Scala List 常用的方法:
序號
方法及描述

1
def +:(elem: A): List[A]
為列表預添加元素
scala> val x = List(1)x: List[Int] = List(1)scala> val y = 2 +: xy: List[Int] = List(2, 1)scala> println(x)List(1)

2
def ::(x: A): List[A]
在列表開頭添加元素

3
def :::(prefix: List[A]): List[A]
在列表開頭添加指定列表的元素

4
def :+(elem: A): List[A]
復制添加元素后列表。
scala> val a = List(1)a: List[Int] = List(1)scala> val b = a :+ 2b: List[Int] = List(1, 2)scala> println(a)List(1)

5
def addString(b: StringBuilder): StringBuilder
將列表的所有元素添加到 StringBuilder

6
def addString(b: StringBuilder, sep: String): StringBuilder
將列表的所有元素添加到 StringBuilder妄痪,并指定分隔符

7
def apply(n: Int): A
通過列表索引獲取元素

8
def contains(elem: Any): Boolean
檢測列表中是否包含指定的元素

9
def copyToArray(xs: Array[A], start: Int, len: Int): Unit
將列表的元素復制到數(shù)組中哈雏。

10
def distinct: List[A]
去除列表的重復元素,并返回新列表

11
def drop(n: Int): List[A]
丟棄前n個元素衫生,并返回新列表

12
def dropRight(n: Int): List[A]
丟棄最后n個元素裳瘪,并返回新列表

13
def dropWhile(p: (A) => Boolean): List[A]
從左向右丟棄元素,直到條件p不成立

14
def endsWith[B](that: Seq[B]): Boolean
檢測列表是否以指定序列結(jié)尾

15
def equals(that: Any): Boolean
判斷是否相等

16
def exists(p: (A) => Boolean): Boolean
判斷列表中指定條件的元素是否存在罪针。
判斷l(xiāng)是否存在某個元素:
scala> l.exists(s => s == "Hah")res7: Boolean = true

17
def filter(p: (A) => Boolean): List[A]
輸出符號指定條件的所有元素彭羹。
過濾出長度為3的元素:
scala> l.filter(s => s.length == 3)res8: List[String] = List(Hah, WOW)

18
def forall(p: (A) => Boolean): Boolean
檢測所有元素。
例如:判斷所有元素是否以"H"開頭:
scala> l.forall(s => s.startsWith("H")) res10: Boolean = false

19
def foreach(f: (A) => Unit): Unit
將函數(shù)應(yīng)用到列表的所有元素

20
def head: A
獲取列表的第一個元素

21
def indexOf(elem: A, from: Int): Int
從指定位置 from 開始查找元素第一次出現(xiàn)的位置

22
def init: List[A]
返回所有元素泪酱,除了最后一個

23
def intersect(that: Seq[A]): List[A]
計算多個集合的交集

24
def isEmpty: Boolean
檢測列表是否為空

25
def iterator: Iterator[A]
創(chuàng)建一個新的迭代器來迭代元素

26
def last: A
返回最后一個元素

27
def lastIndexOf(elem: A, end: Int): Int
在指定的位置 end 開始查找元素最后出現(xiàn)的位置

28
def length: Int
返回列表長度

29
def map[B](f: (A) => B): List[B]
通過給定的方法將所有元素重新計算

30
def max: A
查找最大元素

31
def min: A
查找最小元素

32
def mkString: String
列表所有元素作為字符串顯示

33
def mkString(sep: String): String
使用分隔符將列表所有元素作為字符串顯示

34
def reverse: List[A]
列表反轉(zhuǎn)

35
def sorted[B >: A]: List[A]
列表排序

36
def startsWith[B](that: Seq[B], offset: Int): Boolean
檢測列表在指定位置是否包含指定序列

37
def sum: A
計算集合元素之和

38
def tail: List[A]
返回所有元素派殷,除了第一個

39
def take(n: Int): List[A]
提取列表的前n個元素

40
def takeRight(n: Int): List[A]
提取列表的后n個元素

41
def toArray: Array[A]
列表轉(zhuǎn)換為數(shù)組

42
def toBuffer[B >: A]: Buffer[B]
返回緩沖區(qū),包含了列表的所有元素

43
def toMap[T, U]: Map[T, U]
List 轉(zhuǎn)換為 Map

44
def toSeq: Seq[A]
List 轉(zhuǎn)換為 Seq

45
def toSet[B >: A]: Set[B]
List 轉(zhuǎn)換為 Set

46
def toString(): String
列表轉(zhuǎn)換為字符串

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墓阀,一起剝皮案震驚了整個濱河市毡惜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斯撮,老刑警劉巖经伙,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異勿锅,居然都是意外死亡帕膜,警方通過查閱死者的電腦和手機枣氧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垮刹,“玉大人作瞄,你說我怎么就攤上這事∥H遥” “怎么了宗挥?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長种蝶。 經(jīng)常有香客問我契耿,道長,這世上最難降的妖魔是什么螃征? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任搪桂,我火速辦了婚禮,結(jié)果婚禮上盯滚,老公的妹妹穿的比我還像新娘踢械。我一直安慰自己,他們只是感情好魄藕,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布内列。 她就那樣靜靜地躺著,像睡著了一般背率。 火紅的嫁衣襯著肌膚如雪话瞧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天寝姿,我揣著相機與錄音交排,去河邊找鬼。 笑死饵筑,一個胖子當著我的面吹牛埃篓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播根资,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼架专,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嫂冻?” 一聲冷哼從身側(cè)響起胶征,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桨仿,沒想到半個月后睛低,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年钱雷,在試婚紗的時候發(fā)現(xiàn)自己被綠了骂铁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡罩抗,死狀恐怖拉庵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情套蒂,我是刑警寧澤钞支,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站操刀,受9級特大地震影響烁挟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骨坑,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一撼嗓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧欢唾,春花似錦且警、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亡脸,卻和暖如春押搪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浅碾。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留续语,地道東北人垂谢。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像疮茄,于是被迫代替她去往敵國和親滥朱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容