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

У меня есть некоторый класс C:

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

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

object C {
  var id_counter = 0
}

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

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

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

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

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

id_counter += 1
1
задан Łukasz Lew 9 May 2010 в 17:38
поделиться

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

1
ответ дан 3 September 2019 в 00:43
поделиться

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

idCounter += 1

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

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

Обновление:

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

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

1
ответ дан 3 September 2019 в 00:43
поделиться

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

.
0
ответ дан 3 September 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: