(Есть несколько вопросов о распределенных по времени разреженных массивах, но я ищу эффективность памяти.)
Мне нужен эквивалент List<T>
или Map<Integer,T>
, который
- Может увеличиваться по требованию, просто устанавливая ключ, который больше, чем когда-либо ранее. (Можно считать, что клавиши неотрицательны.)
- Является как эффективный с точки зрения памяти как
ArrayList<T>
в случае, если большинство индексов не являютсяnull
, то есть когда фактические данные не очень разрежены. - Когда индексы разрежены, потребляет пространство, пропорциональное числу индексов
null
. - Использует меньше памяти, чем
HashMap<Integer,T>
(так как это автоматически расшифровывает ключи и, вероятно, не использует тип скалярного ключа). - Может получить или установить элемент в амортизированном журнале (N), где N - количество записей: не обязательно должно быть линейное время, бинарный поиск будет приемлемым.
- Реализовано в невирусной чистой Java-библиотеке с открытым исходным кодом (желательно в Maven Central).
Кто-нибудь знает о таком классе утилиты?
Я бы ожидал, что в коллекциях Commons будет один, но это не похоже.
Я столкнулся с org.apache.commons.math.util.OpenIntToFieldHashMap
, который выглядит почти правильно, за исключением типа значения FieldElement
, который кажется безвозмездным; Я просто хочу T extends Object
. Похоже, что его исходный код будет легко редактировать более общим, хотя я бы предпочел использовать бинарную зависимость, если она доступна.