有界Scala队列 - 扩展 - 超越+ =或++ =

时间:2017-08-11 14:31:31

标签: scala queue maxlength

使用这个message,我扩展了一个可变队列,以便拥有一个固定长度的队列。

import scala.collection.mutable

class FiniteQueue[A](limit: Int) extends mutable.Queue[A] {

  override def enqueue(elems : A*) = {
    super.enqueue()
    while(super.size > limit) {
      super.dequeue()
    }
  }
}

因此,当我使用

时,这将起作用
val myQueue: FiniteQueue[Double] = new FiniteQueue(3)
myQueue.enqueue(1) //myQueue = {1}
myQueue.enqueue(2) //myQueue = {1,2}
myQueue.enqueue(3) //myQueue = {1,2,3}
myQueue.enqueue(4) //myQueue = {2,3,4}

如果我这样做

myQueue += (1,2,3,4)

然后我最终得到myQueue = {1,2,3,4}而不是{2,3,4}

那么如何覆盖+=功能?

1 个答案:

答案 0 :(得分:2)

您需要从包+=中的特征Growable覆盖scala.collection.generic方法。请注意,如果要添加的值是列表,则直接调用++=方法添加元素:this ++= elems,而不是调用super.enqueue(elems)。在覆盖+=方法中添加元素后,您需要检查大小约束以保持允许的队列限制。

  class FiniteQueue[A](limit: Int) extends mutable.Queue[A] {

    override def enqueue(elems: A*): scala.Unit = {
      this ++= elems
      while(super.size > limit) {
        super.dequeue()
      }
    }

    override def +=(elem1: A, elem2: A, elems: A*): FiniteQueue.this.type = {
      enqueue(elem1)
      enqueue(elem2)
      this ++= elems
      while(super.size > limit) {
        super.dequeue()
      }
      this
    }
  }

  val myQueue: FiniteQueue[Double] = new FiniteQueue(3)
  println("Queue => " +myQueue)
  myQueue.enqueue(1) //myQueue = {1}
  println("Queue => " +myQueue)
  myQueue.enqueue(2) //myQueue = {1,2}
  println("Queue => " +myQueue)
  myQueue.enqueue(3) //myQueue = {1,2,3}
  println("Queue => " +myQueue)
  myQueue.enqueue(4) //myQueue = {2,3,4}
  println("Queue => " +myQueue)
  myQueue += (4,5,6,7,8)
  println("Queue => " +myQueue)

//Result:
Queue => Dual()
Queue => Dual(1.0)
Queue => Dual(1.0, 2.0)
Queue => Dual(1.0, 2.0, 3.0)
Queue => Dual(2.0, 3.0, 4.0)
Queue => Dual(6.0, 7.0, 8.0))