2012-02-14 24 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',對吧?) – 2012-02-14 06:31:21

+0

@Chris:這是一個最小的工作示例:-)在現實生活中,我想重新實現自己的函數用於不同種類的SortedMap。 – 2012-02-14 12:32:54

+0

是的,我們正在討論'scala.collection.immutable.SortedMap'。 – 2012-02-14 12:33:30

回答

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 

我缺少的東西?