Чи існує структура даних для цього типу списку / карти?


22

Можливо, є назва того, що я хочу, але я цього не знаю. Мені потрібно щось подібне до LinkedHashMapJava, але там, де воно повертає значення "попереднього", якщо у вказаного ключа немає значення.

Тобто, у мене є список об'єктів, що зберігаються цілим ключем (який у моєму випадку є одиницями часу):

; key->value
10->A
15->B
20->C

Отже, якби я запитав значення для ключа 0-9, воно повернеться null. Особлива частина - якщо я запитав щось 10 <= i <= 14, він повертає A. Або для i> = 20, він повертає C.

Чи існує структура даних для цього?


Я не знаю, чи є реалізований, але ви, ймовірно, можете розширити існуючий, щоб зробити це. Чи буде вона відповідати вашим цілям ефективності чи ні без переписування, я не знаю ...
Rig

1
+1 за відмінне запитання. Більшість людей з трьома низькозначними представниками задають питання "будь ласка, зробіть домашнє завдання". Тут не так.
Тулен Кордова

Відповіді:


33

Ви шукаєте навігаційну карту . Це підтип SortedMap, який також має деякі функції, крім характеру сортування карти. Зауважте, що навігаційна карта "призначена для заміщення інтерфейсу SortedMap." ( Удосконалення рамок колекцій Java SE 6 ). Все, що зараз реалізує, SortedMapреалізує, NavigableMapі це, ймовірно, залишиться правдою.

Зокрема, метод, floorKey(K key)який "повертає найбільший ключ менше або дорівнює даному ключу, або нульовий, якщо такого ключа немає.

Це лише один із багатьох методів, що дозволяють отримати конкретні ключі або підмапи карти.

  • стеля / підлога (запис, який вище / нижче параметра)
  • доступ ключів або карти у порядку зменшення
  • голова / хвіст (записи менше / більше, ніж заданий ключ)
  • вище / нижче (наступна клавіша, яка вище або нижче параметра)
  • підменю (дано дві клавіші, поверніть карту, що знаходиться між двома клавішами)

У Java є дві реалізації NavigableMap - TreeMap та ConcurrentSkipListMap .

Якщо ви подивитесь на ідею / реалізацію списку пропусків, то побачите, чому вона справді добре працюватиме з такою структурою та її запитами.


1+ чудова відповідь. Ніколи не думав, що така специфічна Карта існувала в Java API.
Tulains Córdova

@ user61852 Мій улюблений тип даних - це пропущений список, і я порозмовляв із ним. Коли я побачив, що він реалізований в 1.6, я переглянув, що все це надає, і помітив інтерфейси, які він мав, і, таким чином, моє знайомство з ним.

Ось такі речі, які мене переконують, Java - одна з найкращих мов, які ви можете знайти.
Tulains Córdova

1
Зауважте, що, мабуть, це вирішується проблемою ОП, воно не діє так, як LinkedHashMapвін згадує. Ні, TreeMapні ConcurrentSkipListMapвпорядковані часом вставки, як LinkedHashMap, наприклад , вони впорядковані Comparatorприродним замовленням клавіш або, якщо вони реалізуються Comparable.
MikeFHay

1
Дуже хороший момент. Операція підлоги - це те, що я шукав, порівняльник, який я можу легко додати. І в моєму випадку набагато приємніше реалізувати компаратор, а не винаходити колесо. Спасибі.
Нік

1

Що ви шукаєте, це таблиця символів, яка підтримує впорядковані операції. І у вашому випадку це підлога.

Хеш-реалізація таблиці символів є найшвидшою, але вона не пропонує впорядкованих операцій.

Але реалізація дерев символьних таблиць робить. Прикладом цього в Java є клас TreeMap

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.