1

我有一些C类:

class C (...) { ... }

我想用它来索引一个有效的地图。最有效的地图是一个数组。所以我在伴生对象中添加了一个“全局”“静态”计数器,为每个对象提供唯一 ID:

object C {
  var id_counter = 0
}

在 C 的主要构造函数中,每次创建 CI 时都希望记住全局计数器值并增加它。
问题一:怎么办?

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

问题2:是否有可能具有类型安全性?

更新:
问题 2 中的类型安全涉及地图索引的类型,以避免混合两个不相关的整数。值当然是(类型)安全的..

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

id_counter += 1
4

3 回答 3

1

我没有看到问题。我可能会将柜台设为私有,以便在外面编码class并且object C无法更改它。增加var类型的 aInt是微不足道的:

idCounter += 1

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

我怀疑我没有真正理解你的问题......

更新:

大概增加构造函数中的计数器。

至于创建一个实际完美的散列函数,我认为你并没有真正走在正确的轨道上。(您刚刚将映射从您的实际密钥推送到您自己的代码中。)您应该阅读创建最小和/或完美哈希函数的技术。

于 2010-05-09T14:27:09.107 回答
1

回答你的问题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:默认构造函数只是类型的主体,除了方法和其他构造函数的定义。

于 2010-05-09T22:01:56.787 回答
0

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

于 2010-05-14T12:28:39.583 回答