iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 19
0
Software Development

認識scala系列 第 19

Scala day 19 (List & ListBuffer)

  • 分享至 

  • xImage
  •  

List

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)

List 一些好用的 method

迴圈

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

ListBuffer

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)

總結


  • scala 的 List 是 immutable,所以在使用上無法去直接 update 裡面的元素,可能要運用 insert 及 filter 的功能來達到 update 的效果.
  • List 在程式很常用到,ListBuffer 透過運算子就可以刪除新增元素使用起來很方便.

上一篇
Scala day 18 (Array & ArrayBuffer)
下一篇
Scala day 20 (Map)
系列文
認識scala30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言