2012-02-14 9 views
1

どういうわけか、私はSortedMapを正しく実装できないようです。ここでは、最小限の(非)作業例です::ScalaでのカスタムSortedMapの実装

class MyMap[A](t: Map[Long, A]) extends SortedMap[Long, A] { 
    protected val internalMap = TreeMap(t.toArray: _*) 

    def -(key: Long) = MyMap(internalMap - key) 
    def get(key: Long) = internalMap.get(key) 
    def rangeImpl(from: Option[Long], until: Option[Long]) = TreeMap(internalMap.rangeImpl(from, until)) 
    def iterator = internalMap.iterator 
    def ordering = internalMap.ordering 
} 

しかし、私はMyMapコンストラクタに渡すものは何でも、呼び出し、例えば、そのsizeは、常に0


補遺を返します。私はちょうど新しいプロジェクトにコードをコピーして貼り付けました。そして、それは8- \と働いていました。それを有効にするために質問を変更させてください。これは正しい方法ですか?SortedMap?それをコンパイルするために不足しているメソッドのカップルを追加した後、あなたのコードは私のためにうまく働いた

+2

あなたの付録に質問で答える: 'TreeMap'は' SortedMap'を実装しているので、なぜそれを 'MyMap'でラップする必要がありますか? 'TreeMap'を直接使うのではないのですか? (私たちは 'scala.collection.immutable.TreeMap'について話しています。) –

+0

@Chris:これは最小の実例でした:-)実生活では、自分自身を再実装したい異なる種類のSortedMapの関数 –

+0

そして、はい、私たちは 'scala.collection.immutable.SortedMap'について話しています。 –

答えて

3

class MyMap[A](t: Map[Long, A]) extends SortedMap[Long, A] { 
    protected val internalMap = TreeMap(t.toArray: _*) 
    def +[B1 >: A](kv: (Long, B1)) = new MyMap(internalMap + kv) 
    def -(key: Long) = new MyMap(internalMap - key) 
    def get(key: Long) = internalMap.get(key) 
    def rangeImpl(from: Option[Long], until: Option[Long]) = internalMap.rangeImpl(from, until) 
    def iterator = internalMap.iterator 
    def ordering = internalMap.ordering 
} 

REPLから:

scala> t 
res5: Map[Long,String] = Map(123 -> abc, 456 -> def) 

scala> new MyMap(t) 
res6: MyMap[String] = Map(123 -> abc, 456 -> def) 

scala> res6.size 
res7: Int = 2 

私は何かが足りないのですか?