【问题标题】:What Scala Map methods to override要覆盖哪些 Scala Map 方法
【发布时间】:2013-11-05 20:22:31
【问题描述】:

我想创建一个扩展Map[A, Int]Counter[A] 数据结构(受Python 的Counter 启发),它只记录A 类型的项目的出现次数。我希望它有 2 个额外的方法 add(item: A)remove(item: A) 递增/递减与 item 关联的计数器,当然我还想要所有不错的 Scala 集合方法,如 mapfilter 等,所以我可能应该是扩展Map[A, Int]。但是,对于我应该从 Map 覆盖/实现哪些最小方法集以使其他 Scala 集合方法简单地工作,我感到困惑。

【问题讨论】:

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


    【解决方案1】:

    考虑用委托代替继承。换句话说,你的类可以扩展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
      }
    }
    

    【讨论】:

    • 但是我必须委托 Map 中的所有 100 个左右的方法,对吗?我想覆盖最小的方法集...
    • 没有。我上面提供的类代表了您必须实现的最低要求。所以现在另一个班级可以说val map = new MyMap[Int, Int]。例如,因为filterMap 特征中的具体方法,所以您不必实现它。但是调用它可能会使客户与它的行为混淆。因此,您可以使用 IDE 来实现带有 super 的所有内容,或者您​​可以让您的类不扩展 Map。希望其他人能加入其他更好的解决方案,因为我也在学习 Scala。
    • 我刚刚在这里实现了:github.com/pathikrit/scalgos/commit/…
    【解决方案2】:

    你应该看看这个: http://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html 它详细解释了在 scala 中构建新集合的过程。 如果您不想阅读整篇文章,可以直接跳转到“集成新集合和地图”部分,该部分通过示例展示了如何构建新类型的地图 - 正是您想要做的。

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 2021-07-18
      • 2015-02-25
      • 1970-01-01
      • 2016-11-11
      • 2011-09-20
      • 2016-04-13
      • 2021-01-06
      • 2015-10-31
      相关资源
      最近更新 更多