2013-10-26 101 views
1

我想創建一個Counter[A]數據結構(靈感來自Python的Counter),它擴展了Map[A, Int],它只是保留A類型的項目出現次數。我希望它有2種額外的方法add(item: A)remove(item: A)這遞增/計數器,item相關的遞減和ofcourse我也希望所有的漂亮斯卡拉收集方法,如mapfilter等所以我可能要延長Map[A, Int]。但是,我很困惑應該從Map中爲其他Scala收集方法簡單地工作而重寫/實現哪些最小方法。什麼Scala地圖方法來覆蓋

回答

4

考慮用代理替換繼承。換句話說,你的班級可以延伸Map[A, Int],但它應該包含一個私人的Map[A, Int]成員。所有對您班級的呼叫只需將相同的呼叫委託給該成員。

下面是部分實現我的建議:

class MyClass[A, Int] extends collection.immutable.Map[A, Int] { 
    private val map = collection.immutable.Map.empty[A, Int] 

    def get(key: A): Option[Int] = { 
    map.get(key) 
    } 

    def iterator: Iterator[(A, Int)] = { 
    map.iterator 
    } 

    def -(key: A): Map[A, Int] = { 
    map - key 
    } 

    def +[B1 >: Int](kv: (A, B1)): Map[A, B1] = { 
    map + kv 
    } 
} 
+0

但是,我將不得不委託Map中的所有100個左右的方法嗎?我想覆蓋最小的一組方法...... – pathikrit

+0

不是。我上面提供的類代表了您必須實現的最小程度。所以現在另一個類可以說'val map = new MyMap [Int,Int]'。因爲'filter',例如,是'Map'特性中的一個具體方法,所以你不必實現它。但稱它可能會使客戶與其行爲混淆。所以你可以用你的IDE用'super'實現所有的東西,或者你可以讓你的類不擴展'Map'。希望其他人也會和其他更好的解決方案一起合作,因爲我也一直在學習Scala。 – Vidya

+0

我剛在這裏實現它:https://github.com/pathikrit/scalgos/commit/597baeb406d92c179e919faff3c3fe1d8141193e – pathikrit