要覆盖的Scala Map方法

时间:2013-10-26 20:21:02

标签: scala counter scala-collections scala-2.10 scala-2.11

我想创建一个Counter[A]数据结构(受Python的Counter启发),扩展Map[A, Int],只保留A类型项的出现次数。我希望它有2个额外的方法add(item: A)remove(item: A),它们增加/减少与item相关联的计数器。当然,我也想要所有不错的Scala集合方法,如map,{ {1}}等所以我可能应该扩展filter。但是,我很困惑我应该从Map[A, Int]覆盖/实现什么是最小的方法集,以便其他Scala集合方法能够简单地工作。

2 个答案:

答案 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中构建新集合的过程。 如果您不想阅读整篇文章,可以直接跳到“集成新的集合和地图”部分,该部分通过示例演示如何构建新类型的地图 - 正是您想要做的事情。