Maximum Length for scala queue

后端 未结 4 1490
死守一世寂寞
死守一世寂寞 2020-12-09 04:55

I\'m curious if Scala has some gem hidden in its collection classes that I can use. Basically I\'m looking for something like a FIFO queue, but that has an upper-limit on i

4条回答
  •  Happy的楠姐
    2020-12-09 05:12

    Here is an immutable solution:

    class FixedSizeFifo[T](val limit: Int)
    ( private val out: List[T], private val in: List[T] ) 
    extends Traversable[T] {
    
      override def size = in.size + out.size
    
      def :+( t: T ) = {
        val (nextOut,nextIn) = if (size == limit) {
          if( out.nonEmpty) {
            ( out.tail, t::in ) 
          } else {
            ( in.reverse.tail, List(t) )
          }
        } else ( out, t::in )
          new FixedSizeFifo( limit )( nextOut, nextIn )
      }
    
      private lazy val deq = {
        if( out.isEmpty ) {
          val revIn = in.reverse
          ( revIn.head, new FixedSizeFifo( limit )( revIn.tail, List() ) )
        } else {
          ( out.head, new FixedSizeFifo( limit )( out.tail, in ) )
        }
      }
      override lazy val head = deq._1
      override lazy val tail = deq._2
    
      def foreach[U]( f: T => U ) = ( out ::: in.reverse ) foreach f
    
    }
    
    object FixedSizeFifo {
      def apply[T]( limit: Int ) = new FixedSizeFifo[T]( limit )(List(),List())
    }
    

    An example:

    val fifo = FixedSizeFifo[Int](3) :+ 1 :+ 2 :+ 3 :+ 4 :+ 5 :+ 6
    println( fifo )                //prints: FixedSizeFifo(4, 5, 6)
    println( fifo.head )           //prints: 4
    println( fifo.tail :+ 7 :+8 )  //prints: FixedSizeFifo(6, 7, 8)
    

提交回复
热议问题