Идеальный хэш в Scala

У меня есть класс C:

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

Я хочу использовать его для индексации эффективной карты. Самая эффективная карта - Массив. Поэтому я добавляю "глобальный" "статический" счетчик в объект-компаньон, чтобы дать каждому объекту уникальный идентификатор:

object C {
  var id_counter = 0
}

В первичном конструкторе C, при каждом создании C I хочется запомнить значение глобального счетчика и увеличить его.
Вопрос 1: Как это сделать?

Теперь я могу использовать id в объектах C как идеальный хеш для индексации массива. Но массив не сохраняет информацию о типе, как если бы map указывал, что данный массив индексируется идентификатором Си.

Вопрос 2: возможно ли иметь его с типом безопасности?

Обновить:
Безопасность типа в вопросе 2 касается типа индекса карты, чтобы избежать смешивания двух не связанных целых чисел. Значение конечно (тип) безопасно..

Вопрос 1 спрашивает, как увеличить переменную в конструкторе по умолчанию?
Т.е. куда девать?

id_counter += 1

3 ответа

Решение

Ответ на ваш вопрос 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: Конструктор по умолчанию - это просто тело типа, за исключением определений методов и других конструкторов.

Я не вижу проблемы. Я бы, наверное, сделал счетчик приватным, так что код снаружи class а также objectC не может изменить это. Увеличение var типа Int тривиально:

idCounter += 1

Массивы безопасны от типов в Scala, поскольку они реализуются непосредственно массивами JVM (начиная с версии 2.8).

Я подозреваю, что я не совсем понял ваши вопросы...

Обновить:

Увеличение счетчика в конструкторе, предположительно.

Что касается создания действительно совершенной хэш-функции, я не думаю, что вы действительно на правильном пути. (Вы только что выдвинули отображение из того, что у вас есть в реальных ключах, в ваш собственный код.) Вам следует ознакомиться с методами создания минимальных и / или совершенных хеш-функций.

Не могли бы вы сделать конструктор по умолчанию для C частным и предоставить метод фабрики в объекте-компаньоне (который мог бы легко справиться с обновлением счетчика)?

Другие вопросы по тегам