Scala中的完全散列

Scala中的完全散列,scala,types,hash,scala-2.8,perfect-hash,Scala,Types,Hash,Scala 2.8,Perfect Hash,我有一些C类: class C (...) { ... } 我想用它来索引一个有效的地图。最有效的映射是数组。 因此,我在companion对象中添加了一个“全局”“静态”计数器,为每个对象提供唯一的id: object C { var id_counter = 0 } 在C的主构造函数中,每次创建C时,我都希望 记住全局计数器值并增加它。 问题1:如何做 现在我可以使用C对象中的id作为索引数组的完美哈希。 但数组并不像map那个样保留类型信息,给定的数组是由C的id索引的 问题2:是

我有一些C类:

class C (...) { ... }
我想用它来索引一个有效的地图。最有效的映射是数组。 因此,我在companion对象中添加了一个“全局”“静态”计数器,为每个对象提供唯一的id:

object C {
  var id_counter = 0
}
在C的主构造函数中,每次创建C时,我都希望 记住全局计数器值并增加它。
问题1:如何做

现在我可以使用C对象中的id作为索引数组的完美哈希。 但数组并不像map那个样保留类型信息,给定的数组是由C的id索引的

问题2:是否可以使用类型安全

更新:
问题2中的类型安全性涉及映射的索引类型,以避免混合两个不相关的int。 当然,该值是(类型)安全的

问题1询问如何在默认构造函数中增加变量?
Ie:放在哪里

id_counter += 1

我看不出有什么问题。我可能会将计数器设置为私有,这样
之外的代码和
对象
C
就无法更改它。对
Int
类型的
var
进行递增非常简单:

idCounter += 1
数组在Scala中是类型安全的,因为它们直接由JVM数组实现(从2.8开始)

我想我还没有真正理解你的问题

更新:

大概是递增构造函数中的计数器


至于创建一个真正完美的散列函数,我认为你的思路并不正确。(您刚刚将映射从实际键推送到了自己的代码中。)您应该阅读创建最小和/或完美哈希函数的技术。

回答问题2:

case class C_Id(val asInt: Int)

object C {
  private var list: ArrayBuffer[C] 
  // resizable array in scala.collection.mutable
  // you can also use ArrayList

  def apply(id: C_Id) = list(id.asInt) // only accepts an id of C
  ...
}

class C (...) {
  // in constructor:
  list += this
}

对于已编辑的问题1:除了方法和其他构造函数的定义之外,默认构造函数只是类型的主体。

能否将C的默认构造函数设置为私有,并在伴生对象中提供工厂方法(可以轻松处理更新计数器)

看起来不错,但我需要的不仅仅是apply。我不能从数组或Seq继承吗?您不能像在Java中那样从数组继承。只要让你的方法调用
列表
上相应的方法,就像
应用
所做的那样。它能帮我吗?以类似于RichString?否的方式。当您希望向给定类型的每个实例添加方法时,它们非常有用。这里您处理的是
C
伴生对象的单个实例,以及
ArrayBuffer[C]
的单个实例。我相信是这样的,前提是在构造函数(全部)返回之前不发布值。