2017-08-11 34 views
0

使用此message,我已经扩展了一个可变队列,以便有一个固定长度的队列。有界Scala队列 - 扩展骑+ =或++ =

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

您需要覆盖来自包scala.collection.generic的特征Growable中的+=方法。注意,如果要添加的值是列表,则直接调用++=方法添加元素: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)) 
+0

谢谢拉嘉,这工作,非常感谢。 – IncompleteCoder