第十章 Scala 容器基础(八):用ArrayBuffer作为你指定的可变序列

问题:

    你如何选择一个通用的可变序列在你的Scala应用中。

解决:

    正像Vector被推荐作为不可变序列容器的指定类,ArrayBuffer则被推荐作为通用的可变序列容器指定类。(ArrayBuffer是带索引的序列容器,如果你想使用链式序列容器,可以使用ListBuffer)

    在使用ArrayBuffer之前你必须先引入它:

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:

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

    与其它可变容器一样,你可以使用+=,++=来给容器添加元素:

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)

    你还可以使用-+,--+方法来删除容器中的元素:

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> 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通常用来高效低构造一个大型的容器,当新元素总是添加到最后的时候。”

    如果你需要一个可变序列容器可以像使用List一样,那么应该用ListBuffer。“ListBuffer就像ArrayBuffer一样,除了它内部实现是一个链表。如果你准备在建立完容器以后,把当前容器转化为一个List,使用ListBuffer是一个更好的选择。“






转载于:https://my.oschina.net/nenusoul/blog/656317

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值