PureBasic

Руководство - Некоторые подсказки & приемы

"Использование хеш-карты для индексации списка"

Списки обеспечивают эффективный способ построения структурированной системы хранения данных, однако у них есть недостаток. Если вы не знаете точно, где в списке находится конкретный элемент, вы должны проверить каждую запись в списке, чтобы найти нужный.

Карты также предоставляют аналогичную функцию, но индексируются по ключевому значению, однако они также имеют недостаток, они не поддерживают элементы, которые вставляются в список.

Однако, используя комбинацию этих двух технологий, Вы можете аккуратно избежать обеих этих проблем...

В этом примере загружается структурированный связный список данных о книгах и создается индекс Номеров 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

Навигация Руководства

< Расширенные функции - Обзор