有界 Scala 队列 - 扩展 - 覆盖 += 或 ++=
Bounded Scala Queue - extended - over ride += or ++=
使用这个 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}
那么如何覆盖 +=
功能?
您需要从包 scala.collection.generic
的特征 Growable
覆盖 +=
方法。注意,如果要添加的值是列表,那么直接调用++=
方法添加元素:this ++= elems
,而不是调用super.enqueue(elems)
是行不通的。在 override +=
方法中添加元素后,您需要检查大小限制以维持允许的队列限制。
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))
使用这个 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}
那么如何覆盖 +=
功能?
您需要从包 scala.collection.generic
的特征 Growable
覆盖 +=
方法。注意,如果要添加的值是列表,那么直接调用++=
方法添加元素:this ++= elems
,而不是调用super.enqueue(elems)
是行不通的。在 override +=
方法中添加元素后,您需要检查大小限制以维持允许的队列限制。
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))