Возможно, есть название для того, что я хочу, но я не знаю об этом. Мне нужно что-то похожее на a LinkedHashMap
в Java, но где он возвращает «предыдущее» значение, если в указанном ключе нет значения.
То есть у меня есть список объектов, хранящихся с помощью целочисленного ключа (в моем случае это единицы времени):
; key->value
10->A
15->B
20->C
Итак, если бы я запросил значение для ключа 0-9, он бы вернулся null
. Особая часть состоит в том, что если бы я запросил что-то 10 <= i <= 14, он вернул бы A. Или, для i> = 20, он вернул бы C.
Есть ли структура данных для этого?
Ответы:
Вы ищете NavigableMap . Это подтип SortedMap, который также имеет некоторые функции, помимо характера сортируемой карты. Обратите внимание, что карта Navigable «предназначена для замены интерфейса SortedMap». ( Java SE 6 Collections Framework Расширения ). Все, что в настоящее время реализует,
SortedMap
реализует,NavigableMap
и это, вероятно, останется верным.В частности, метод,
floorKey(K key)
который «возвращает наибольший ключ, меньший или равный данному ключу, или ноль, если такого ключа нет.Это только один из многих методов, которые позволяют вам получить определенные ключи или подкарты карты.
В Java есть две реализации NavigableMap - TreeMap и ConcurrentSkipListMap .
Если вы посмотрите на идею / реализацию пропускающего списка, вы поймете, почему он действительно хорошо работает с такой структурой и ее запросами.
источник
LinkedHashMap
он упоминает. Ни ,TreeMap
ниConcurrentSkipListMap
упорядочены по времени введения , какLinkedHashMap
, скорее , они упорядочиваются поComparator
или в ключе естественного порядка , если они реализуютComparable
.То, что вы ищете, это таблица символов, которая поддерживает упорядоченные операции. А в вашем случае это напольная операция.
Хеш-реализация таблицы символов является самой быстрой, но она не предлагает эти упорядоченные операции.
Но древовидная реализация таблиц символов делает. Примером этого в Java является класс TreeMap
источник