2011-08-15 5 views
4

たとえば、0〜最大1000個の要素を含むリストが必要であるとします。この上に、最も古い挿入を最初に削除する必要があります。コレクションはこの機能をネイティブにサポートしていますか?実装についてどうすればいいですか?特定の操作がリスト上で非常に遅いことを理解しているので、別のデータ型が必要なのかもしれません。Scalaで固定サイズのリストを実装するにはどうすればよいですか?

要素を見るとリストに影響しないはずです。私は挿入とサイズの操作だけをしたいです。

+0

1.見つける場合には、私の最初のパスの実装ですか? (私はサイズに拘束されたキューを見ています)2.あなたが必要とする操作についての考えがありますか? – huitseeker

+0

追加情報で修正されました – deltanovember

+0

リスト要素を*見る*必要はありませんか?全く?その場合は、リストの先頭(最後に入力したもの)、末尾(最古の要素?)、またはインデックスを介してアクセスされる要素を調べ始めますか? – huitseeker

答えて

7

サイズに拘束されたキューが必要なようです。これに似た質問があります:Maximum Length for scala queue

この質問には3つの解決策があります。あなたは、

  1. は(別名、「マイライブラリをポン引き」)型クラスの拡張パターンを使用し、サブクラス化によってScalaのQueue実装を拡張する、または
  2. 、スクラッチ(パラダイムは、このためのコードを与えた)からのキューを書くことができますScalaのQueueを拡張します。
1

円形アレイは最も速い実装です。これは、基本的に配列の終わりに達するとラップされる読み込みと書き込みのインデックスを持つ配列です。サイズは次のように定義されています

def size = writeIndex - readIndex + (if (readIndex > writeIndex) array.size else 0) 
7

ここでは他の誰かが、あなたがそれを見たときに、リストの(通常の)要素を削除してくださいそれに有用

import scala.collection._ 
import mutable.ListBuffer 

class FixedList[A](max: Int) extends Traversable[A] { 

    val list: ListBuffer[A] = ListBuffer() 

    def append(elem: A) { 
    if (list.size == max) { 
     list.trimStart(1) 
    } 
    list.append(elem) 
    } 

    def foreach[U](f: A => U) = list.foreach(f) 

} 
関連する問題