我想创建一个扩展的Counter[A]
数据结构(受 Python 的Counter启发),它只Map[A, Int]
记录 type 项的出现次数A
。我希望它有 2 个额外的方法add(item: A)
,以及remove(item: A)
与之关联的递增/递减计数器,item
当然我还想要所有不错的 Scala 集合方法map
,filter
等等,所以我可能应该扩展Map[A, Int]
。但是,对于我应该覆盖/实现Map
其他 Scala 集合方法以使其简单工作的最小方法集,我感到困惑。
问问题
933 次
2 回答
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
}
}
于 2013-10-26T20:34:31.827 回答
1
你应该看看这个: http ://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html 它详细解释了在 scala 中构建新集合的过程。如果您不想阅读整篇文章,您可以直接跳到“集成新集合和地图”部分,该部分通过示例展示了如何构建新类型的地图——这正是您想要做的。
于 2013-10-26T21:00:04.733 回答