scala 的 List 是 immutable 的,所以不管相加或新增元素只要變動的話,都會產生一個新的 List.
List 有個 method 是 :::,可將 2 個 List 串接起來.
scala> val alist = List(1, 2)
alist: List[Int] = List(1, 2)
scala> val blist = List(3, 4 , 5)
blist: List[Int] = List(3, 4, 5)
scala> val clist = alist ::: blist
clist: List[Int] = List(1, 2, 3, 4, 5)
還有一個 method 是 :: ,叫 cons,它會在一個已存在的 List 最前面再加上一個 element :
scala> val names = List("Sam","Jack","Mike")
names: List[String] = List(Sam, Jack, Mike)
scala> val newNames = "Daniel" :: names
newNames: List[String] = List(Daniel, Sam, Jack, Mike)
要宣告一個空的 List 可用 List() 或 Nil.
scala> val emptyList = Nil
emptyList: scala.collection.immutable.Nil.type = List()
一般運算子是從左邊優先執行,例如 : (1 * 2) * 3.呼叫方法可以看成 (1).*(2).
scala> val sum = 1 * 2 * 3
sum: Int = 6
但如果運算子的結尾是冒號(Colon, : ),方法會從右邊開始執行,例如 : 1 :: (2 :: (3 :: Nil)).呼叫方法可以看成 Nil.::(3).
scala> val testlist = 2 :: 3 :: Nil
testlist: List[Int] = List(2, 3)
scala> val testlist = Nil.::(3).::(2)
testlist: List[Int] = List(2, 3)
Int 2 並沒有提供 :: 方法,所以會出錯,所以要在後面在加上有提供 :: 的物件:
scala> val testlist = Nil :: 3 :: 2
<console>:11: error: value :: is not a member of Int
val testlist = Nil :: 3 :: 2
^
scala> val testlist = Nil :: 3 :: 2 :: Nil
testlist: List[Any] = List(List(), 3, 2)
迴圈
scala> val numList = 65 :: 81 :: 67 :: 72 :: 73 :: 90 :: Nil
numList: List[Int] = List(65, 81, 67, 72, 73, 90)
scala> numList.foreach((num: Int) => println(num.toChar))
A
Q
C
H
I
Z
排序:
scala> val numList = 5 :: 1 :: 7 :: 2 :: 3 :: 9 :: Nil
numList: List[Int] = List(5, 1, 7, 2, 3, 9)
scala> numList.sortWith(_ < _)
res9: List[Int] = List(1, 2, 3, 5, 7, 9)
可以定義排序的方法,給 sortWith 排序
scala> val names = List("Sam","Daniel","Jack","Loues","Mike")
names: List[String] = List(Sam, Daniel, Jack, Loues, Mike)
scala> def sortByLength(str1: String ,str2: String) = str1.length < str2.length
sortByLength: (str1: String, str2: String)Boolean
scala> names.sortWith(sortByLength).foreach(println)
Sam
Jack
Mike
Loues
Daniel
取得 element 只要用 List名稱(index),index 從 0 開始 :
scala> names(3)
res21: String = Loues
使用 filter 過濾掉不要的 element :
scala> names.filter(_ != "Jack")
res27: List[String] = List(Sam, Daniel, Loues, Mike)
利用 mkString 將 List 的 elements 組合起來變成一個 String,elements 之間用 mkString 的參數做分隔(這邊用,) :
scala> names.mkString(",")
res18: String = Sam,Daniel,Jack,Loues,Mike
List 是 immutable,但是 ListBuffer 是 mutable 的 :
使用前需要 import scala.collection.mutable.ListBuffer
scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer
new 一個空的 ListBuffer :
scala> val names = new ListBuffer[String]()
names: scala.collection.mutable.ListBuffer[String] = ListBuffer()
新增元素 :
scala> names += "Daniel"
res52: names.type = ListBuffer(Daniel)
scala> names += ("Jack","Ray")
res53: names.type = ListBuffer(Daniel, Jack, Ray)
刪除元素 :
scala> names -= "Jack"
res54: names.type = ListBuffer(Daniel, Ray)
scala> names += ("Daniel","Jack","Ray","Lucy","Allen","Petty")
res62: names.type = ListBuffer(Daniel, Jack, Ray, Lucy, Allen, Petty)
scala> names -= ("Jack","Allen")
res63: names.type = ListBuffer(Daniel, Ray, Lucy, Petty)
刪除 Seq 的元素 :
scala> names --= Seq("Daniel","Lucy")
res64: names.type = ListBuffer(Ray, Petty)
最後可再把它轉成 immutable 的 List :
scala> names.toList
res65: List[String] = List(Ray, Petty)