# Scala List(列表)
Scala 列表類似于數組,它們所有元素的類型都相同,但是它們也有所不同:列表是不可變的,值一旦被定義了就不能改變,其次列表 具有遞歸的結構(也就是鏈接表結構)而數組不是。。
列表的元素類型 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)
)
```
構造列表的兩個基本單位是 **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( "第一網站是 : " + site.head )
println( "最后一個網站是 : " + site.tail )
println( "查看列表 site 是否為空 : " + site.isEmpty )
println( "查看 nums 是否為空 : " + nums.isEmpty )
}
}
```
執行以上代碼,輸出結果為:
```
$ vim Test.scala
$ scala Test.scala
第一網站是 : Runoob
最后一個網站是 : 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 )
}
}
```
執行以上代碼,輸出結果為:
```
$ 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() 方法來創建一個指定重復數量的元素列表:
```
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 )
}
}
```
執行以上代碼,輸出結果為:
```
$ 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() 方法是通過給定的函數來創建列表。
方法的第一個參數為元素的數量,可以是二維的,第二個參數為指定的函數,我們通過指定的函數計算結果并返回值插入到列表中,起始值為 0,實例如下:
```
object Test {
def main(args: Array[String]) {
// 通過給定的函數創建 5 個元素
val squares = List.tabulate(6)(n => n * n)
println( "一維 : " + squares )
// 創建二維列表
val mul = List.tabulate( 4,5 )( _ * _ )
println( "多維 : " + mul )
}
}
```
執行以上代碼,輸出結果為:
```
$ 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 用于將列表的順序反轉,實例如下:
```
object Test {
def main(args: Array[String]) {
val site = "Runoob" :: ("Google" :: ("Baidu" :: Nil))
println( "site 反轉前 : " + site )
println( "site 反轉前 : " + site.reverse )
}
}
```
執行以上代碼,輸出結果為:
```
$ vim Test.scala
$ scala Test.scala
site 反轉前 : List(Runoob, Google, Baidu)
site 反轉前 : List(Baidu, Google, Runoob)
```
## Scala List 常用方法
下表列出了 Scala List 常用的方法:
| 方法 | 描述 |
| --- | --- |
| **def +(elem: A): List\[A\]** | 為列表預添加元素 |
| **def ::(x: A): List\[A\]** | 在列表開頭添加元素 |
| **def :::(prefix: List\[A\]): List\[A\]** | 在列表開頭添加指定列表的元素 |
| **def ::(x: A): List\[A\]** | 在列表開頭添加元素 x |
| **def addString(b: StringBuilder): StringBuilder** | 將列表的所有元素添加到 StringBuilder |
| **def addString(b: StringBuilder, sep: String): StringBuilder** | 將列表的所有元素添加到 StringBuilder,并指定分隔符 |
| **def apply(n: Int): A** | 通過列表索引獲取元素 |
| **def contains(elem: Any): Boolean** | 檢測列表中是否包含指定的元素 |
| **def copyToArray(xs: Array\[A\], start: Int, len: Int): Unit** | 將列表的元素復制到數組中。 |
| **def distinct: List\[A\]** | 去除列表的重復元素,并返回新列表 |
| **def drop(n: Int): List\[A\]** | 丟棄前n個元素,并返回新列表 |
| **def dropRight(n: Int): List\[A\]** | 丟棄最后n個元素,并返回新列表 |
| **def dropWhile(p: (A) => Boolean): List\[A\]** | 從左向右丟棄元素,直到條件p不成立 |
| **def endsWith\[B\](that: Seq\[B\]): Boolean** | 檢測列表是否以指定序列結尾 |
| **def equals(that: Any): Boolean** | 判斷是否相等 |
| **def exists(p: (A) => Boolean): Boolean** | 判斷列表中指定條件的元素是否存在。判斷l是否存在某個元素:`scala> l.exists(s => s == "Hah") res7: Boolean = true` |
| **def filter(p: (A) => Boolean): List\[A\]** | 輸出符號指定條件的所有元素。過濾出長度為3的元素:`scala> l.filter(s => s.length == 3) res8: List[String] = List(Hah, WOW)` |
| **def forall(p: (A) => Boolean): Boolean** | 檢測所有元素。例如:判斷所有元素是否以"H"開頭:`scala> l.forall(s => s.startsWith("H")) res10: Boolean = false` |
| **def foreach(f: (A) => Unit): Unit** | 將函數應用到列表的所有元素 |
| **def head: A** | 獲取列表的第一個元素 |
| **def indexOf(elem: A, from: Int): Int** | 從指定位置 from 開始查找元素第一次出現的位置 |
| **def init: List\[A\]** | 返回所有元素,除了最后一個 |
| **def intersect(that: Seq\[A\]): List\[A\]** | 計算多個集合的交集 |
| **def isEmpty: Boolean** | 檢測列表是否為空 |
| **def iterator: Iterator\[A\]** | 創建一個新的迭代器來迭代元素 |
| **def last: A** | 返回最后一個元素 |
| **def lastIndexOf(elem: A, end: Int): Int** | 在指定的位置 end 開始查找元素最后出現的位置 |
| **def length: Int** | 返回列表長度 |
| **def map\[B\](f: (A) => B): List\[B\]** | 通過給定的方法將所有元素重新計算 |
| **def max: A** | 查找最大元素 |
| **def min: A** | 查找最小元素 |
| **def mkString: String** | 列表所有元素作為字符串顯示 |
| **def mkString(sep: String): String** | 使用分隔符將列表所有元素作為字符串顯示 |
| **def reverse: List\[A\]** | 列表反轉 |
| **def sorted[B >: A]: List\[A\]** | 列表排序 |
| **def startsWith\[B\](that: Seq\[B\], offset: Int): Boolean** | 檢測列表在指定位置是否包含指定序列 |
| **def sum: A** | 計算集合元素之和 |
| **def tail: List\[A\]** | 返回所有元素,除了第一個 |
| **def take(n: Int): List\[A\]** | 提取列表的前n個元素 |
| **def takeRight(n: Int): List\[A\]** | 提取列表的后n個元素 |
| **def toArray: Array\[A\]** | 列表轉換為數組 |
| **def toBuffer[B >: A]: Buffer\[B\]** | 返回緩沖區,包含了列表的所有元素 |
| **def toMap[T, U]: Map[T, U]** | List 轉換為 Map |
| **def toSeq: Seq\[A\]** | List 轉換為 Seq |
| **def toSet[B >: A]: Set\[B\]** | List 轉換為 Set |
| **def toString(): String** | 列表轉換為字符串 |
更多方法可以參考 [API文檔](http://www.scala-lang.org/api/current/scala/collection/immutable/List.html)
- Scala 教程
- Scala 簡介
- Scala 安裝
- Scala 基礎語法
- Scala 數據類型
- Scala 變量
- Scala 訪問修飾符
- Scala 運算符
- Scala IF...ELSE 語句
- Scala 循環
- Scala while 循環
- Scala do...while 循環
- Scala do...while 循環
- Scala break 語句
- Scala 函數
- Scala 函數傳名調用(call-by-name)
- Scala 指定函數參數名
- Scala 函數 - 可變參數
- Scala 遞歸函數
- Scala 高階函數
- Scala 函數嵌套
- Scala 匿名函數
- Scala 偏應用函數
- Scala 函數柯里化(Currying)
- Scala 閉包
- Scala 字符串
- Scala 數組
- Scala Collection
- Scala List(列表)
- Scala Set(集合)
- Scala Map(映射)
- Scala 元組
- Scala Option(選項)
- Scala Iterator(迭代器)
- Scala 類和對象
- Scala Trait(特征)
- Scala 模式匹配
- Scala 正則表達式
- Scala 異常處理
- Scala 提取器(Extractor)
- Scala 文件 I/O