我想创建一个Counter[A]
数据结构(受Python的Counter启发),扩展Map[A, Int]
,只保留A
类型项的出现次数。我希望它有2个额外的方法add(item: A)
和remove(item: A)
,它们增加/减少与item
相关联的计数器。当然,我也想要所有不错的Scala集合方法,如map
,{ {1}}等所以我可能应该扩展filter
。但是,我很困惑我应该从Map[A, Int]
覆盖/实现什么是最小的方法集,以便其他Scala集合方法能够简单地工作。
答案 0 :(得分: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
}
}
答案 1 :(得分:1)
你应该看看这个: http://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html 它详细解释了在scala中构建新集合的过程。 如果您不想阅读整篇文章,可以直接跳到“集成新的集合和地图”部分,该部分通过示例演示如何构建新类型的地图 - 正是您想要做的事情。