Идеальный хэш в 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
а также object
C
не может изменить это. Увеличение var
типа Int
тривиально:
idCounter += 1
Массивы безопасны от типов в Scala, поскольку они реализуются непосредственно массивами JVM (начиная с версии 2.8).
Я подозреваю, что я не совсем понял ваши вопросы...
Обновить:
Увеличение счетчика в конструкторе, предположительно.
Что касается создания действительно совершенной хэш-функции, я не думаю, что вы действительно на правильном пути. (Вы только что выдвинули отображение из того, что у вас есть в реальных ключах, в ваш собственный код.) Вам следует ознакомиться с методами создания минимальных и / или совершенных хеш-функций.
Не могли бы вы сделать конструктор по умолчанию для C частным и предоставить метод фабрики в объекте-компаньоне (который мог бы легко справиться с обновлением счетчика)?