Я хочу что-то вроде массивов переменных-индексов Pascal, где пользователь указывает допустимый диапазон индекса.Вместо выбора по умолчанию для индексации его содержимого от 0 до длины-1 я хочу, чтобы первый индекс был, скажем, 10 000, а последний - 20 000.
Scala настолько гибок, что это то, что я хочу, выполнимо.Тем не менее, дисциплина потребуется для создания структуры данных, которая гармонизируется с остальными коллекциями.
Одним из «очевидных» решений может быть простое указание размера, равного 20 000, и потеря первой половины памяти, но это бесполезно.Кроме того, структура карты может быть сделана работать в один миг.Но накладные расходы, связанные с HashMap, на порядок выше, чем у массивоподобной структуры, которую я описываю.
В идеале, он не должен повторять или заново изобретать уже существующий код, и при этом он не должен быть чрезмерно сложным, даже внутренне.
В качестве примера того, что я хочу, рассмотрим массив с допустимыми индексами от 500 до 999. Я назову свой класс IndexedArray, чтобы отличить его от стандартного массива, используемого в Scala.Также я буду использовать традиционный диапазон из Scala для указания диапазона индекса в объявлении.
Чтобы не усложнять ситуацию, мне не нужна структура данных, чтобы отличаться от структуры.Все индексы будут смежными.
var histogram = new IndexedArray[Int](500 to 999)
histogram(500) = 10 // "first" entry has value 10
histogram(999) += 1 // "last" entry has value 1
Конечно, проблему можно решить, просто используя стандартный массив Scala и переназначая индекс при каждом доступе.Но разве это не рецепт для ошибок?Я хочу, чтобы структура данных скрывала эту маленькую деталь от моих глаз.
Моя структура данных, конечно, будет изменчивой, поскольку стандартные массивы в Scala являются изменяемыми;и единственная разница в поведении заключается в том, что индекс будет автоматически переназначаться при каждом доступе.