第十章 Scala 容器基礎(八):用ArrayBuffer做爲你指定的可變序列

問題:

    你如何選擇一個通用的可變序列在你的Scala應用中。
es6

解決:

    正像Vector被推薦做爲不可變序列容器的指定類,ArrayBuffer則被推薦做爲通用的可變序列容器指定類。(ArrayBuffer是帶索引的序列容器,若是你想使用鏈式序列容器,能夠使用ListBuffer)app

    在使用ArrayBuffer以前你必須先引入它:
dom

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

    接下來你就能夠建立一個空的ArrayBuffer:性能

scala> var fruits = ArrayBuffer[String]()
fruits: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer()

scala> var ints = ArrayBuffer[Int]()
ints: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

    或者,你也能夠建立帶有初始化數據的ArrayBuffer:ui

scala> var numbers = ArrayBuffer(1,2,3)
numbers: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

    與其它可變容器同樣,你能夠使用+=,++=來給容器添加元素:es5

scala> var numbers = ArrayBuffer(1,2,3)
numbers: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

scala> numbers += 4
res3: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4)

scala> numbers ++= Array(5,6)
res4: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6)

    你還能夠使用-+,--+方法來刪除容器中的元素:spa

scala> numbers ++= Array(5,6)
res4: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6)

scala> numbers -= 6
res5: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)

scala> numbers --= Array(3,4,5)
res6: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2)

Discussion:

    除了+=,++=,-=,--=以外,ArrayBuffer還有不少其它方法用來添加或者刪除元素,它們是:scala

scala> val a = ArrayBuffer(1, 2, 3) // ArrayBuffer(1, 2, 3)
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

scala> a.append(4) // ArrayBuffer(1, 2, 3, 4)

scala> a.append(5, 6) // ArrayBuffer(1, 2, 3, 4, 5, 6)

scala> a.appendAll(Seq(7,8)) // ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8)

scala> a.clear // ArrayBuffer()

scala> val a = ArrayBuffer(9, 10) // ArrayBuffer(9, 10)
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(9, 10)

scala> a.insert(0, 8) // ArrayBuffer(8, 9, 10)

scala> a.insert(0, 6, 7) // ArrayBuffer(6, 7, 8, 9, 10)

scala> a.insertAll(0, Vector(4, 5)) // ArrayBuffer(4, 5, 6, 7, 8, 9, 10)

scala> a.prepend(3) // ArrayBuffer(3, 4, 5, 6, 7, 8, 9, 10)

scala> a.prepend(1, 2) // ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> a.prependAll(Array(0)) // ArrayBuffer(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> val a = ArrayBuffer.range('a', 'h') // ArrayBuffer(a, b, c, d, e, f, g)
a: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer(a, b, c, d, e, f, g)

scala> a.remove(0) // ArrayBuffer(b, c, d, e, f, g)
res17: Char = a

scala> a.remove(2, 3) // ArrayBuffer(b, c, g)

scala> val a = ArrayBuffer.range('a', 'h') // ArrayBuffer(a, b, c, d, e, f, g)
a: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer(a, b, c, d, e, f, g)

scala> a.trimStart(2) // ArrayBuffer(c, d, e, f, g)

scala> a.trimEnd(2) // ArrayBuffer(c, d, e)

    ArrayBuffer的Scala文檔提供了對於ArrayBuffer性能方面更詳細的說明:「Append,update,random access消耗常量時間。PrePends和removes和buffer的大小是線性相關的。「同時ArrayBuffer文檔也提到,「ArrayBuffer一般用來高效低構造一個大型的容器,當新元素老是添加到最後的時候。」code

    若是你須要一個可變序列容器能夠像使用List同樣,那麼應該用ListBuffer。「ListBuffer就像ArrayBuffer同樣,除了它內部實現是一個鏈表。若是你準備在創建完容器之後,把當前容器轉化爲一個List,使用ListBuffer是一個更好的選擇。「索引

相關文章
相關標籤/搜索