Search code examples
scalaqueuemaxlength

Bounded Scala Queue - extended - over ride += or ++=


Using this message, I've extended a mutable queue in order to have a fixed-length queue.

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()
    }
  }
}

So this will work when I use

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}

If I do

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

then I end up with myQueue = {1,2,3,4} rather than {2,3,4}

So how do I override the += functionality?


Solution

  • You need to override += method from trait Growable from package scala.collection.generic. Note, if value to add is list, then directly call ++= method to add the elements : this ++= elems, instead calling super.enqueue(elems) will not work. After adding elements in your override += method, you need to check the size constraints in order to maintain allowed limt of queue.

      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))