Руководство - Некоторые подсказки & приемы
"Использование хеш-карты для индексации списка"
Списки обеспечивают эффективный способ построения структурированной системы хранения данных, однако у них есть недостаток. Если вы не знаете точно, где в списке находится конкретный элемент, вы должны проверить каждую запись в списке, чтобы найти нужный.
Карты также предоставляют аналогичную функцию, но индексируются по ключевому значению, однако они также имеют недостаток, они не поддерживают элементы, которые вставляются в список.
Однако, используя комбинацию этих двух технологий, Вы можете аккуратно избежать обеих этих проблем...
В этом примере загружается структурированный связный список данных о книгах и создается индекс Номеров ISBN с помощью хеш-карты. Затем он демонстрирует, как получить доступ к связному списку, используя индекс в хеш-карте.EnableExplicit ; Структура каталога книг. Structure BOOK Title.s Author.s ISBN13.s Price.d EndStructure ; Создать список для хранения записей каталога. NewList Catalog.BOOK() ; Создайте хеш-карту для хранения индекса ISBN. NewMap ISBN13.l() ; Рабочие переменные. Define.l Count, Index Define.s ISBN ; Добавить пустой элемент вверху списка. ; Первый элемент в списке имеет индекс 0, но хеш-карта вернет ноль, если запрашиваемая запись отсутствует. ; Этот пустой элемент позволяет избежать потенциальной проблемы с неправильной ссылкой на возвращаемый элемент первого каталога. AddElement(Catalog()) For Count = 1 To 5 ; Прочитать данные из таблицы в списке. AddElement(Catalog()) Read.s Catalog()\Title Read.s Catalog()\Author Read.s Catalog()\ISBN13 Read.d Catalog()\Price ; Индексируйте ISBN в хеш-карту. ISBN13(Catalog()\ISBN13) = ListIndex(Catalog()) Next Count ; Найти запись. ISBN = "978-0340896983" Index = ISBN13(ISBN) If Index > 0 Debug "Book with ISBN13 " + ISBN + " is at list index " + StrU(Index) + "." Debug "" ; Теперь мы можем напрямую выбрать правый элемент списка без необходимости выполнять поиск. SelectElement(Catalog(), Index) Debug "'" + Catalog()\Title + "' by " + Catalog()\Author Debug "ISBN: " + Catalog()\ISBN13 Debug "Price: " + StrD(Catalog()\Price, 2) Else Debug "В каталоге нет книги с этим Номером ISBN." EndIf End ; Some test data. DataSection BookData: Data.s "Carte Blanche", "Jeffery Deaver", "978-1444716474" Data.d 19.99 Data.s "One Day", "David Nicholls", "978-0340896983" Data.d 7.99 Data.s "Madeleine", "Kate McCann", "978-0593067918" Data.d 20.00 Data.s "The Dukan Diet", "Dr Pierre Dukan", "978-1444710335" Data.d 8.99 Data.s "A Game of Thrones", "George R. R. Martin", "978-0006479888" Data.d 9.99 Data.s "The Help", "Kathryn Stockett", "978-0141039282" Data.d 8.99 EndDataSection
Навигация Руководства
< Расширенные функции - Обзор