Лучшие варианты сортировки записей на основе TDictionary
Из сложного процесса оценки у меня есть структура TDictionary:
target_results : TDictionary<longint, double>;
Ключ представляет собой идентификатор записи в таблице MySQL. Из этого идентификатора я могу получить дату файла и имя файла. Мне нужно доставить эти результаты по одному из следующих вариантов:
1. dictionary value (solved: I'm doing this by assigning the dictionary to an array, sorting it and then retrieving the filename and date for each result, from the database)
2. filename
3. filedate
Я думаю об использовании TVirtualTable (от Devart), так как я уже использую UniDAC в этом проекте. Может кто-нибудь посоветовать более быстрый, гибкий и более родной подход к этому?
1 ответ
Вы не можете отсортировать словарь. Единственная сопоставимая структура со встроенной сортировкой - массив Джуди. Однако вы можете сортировать элементы, на которые указывает словарь. Кажется, вы уже отсортировали ключи, если я вас правильно понял. Теперь вы делаете то же самое для других данных, если хотите отсортировать что-то другое. Алгоритм будет:
- Определите класс или запись, содержащую все данные, которые важны для вас
- Итерируйте или перечисляйте элементы TDictionary в общий TList и для каждого элемента заполняйте класс или запись данными из базы данных.
- Сортируйте элементы в TList по соответствующим критериям. Вы можете увидеть пример такой сортировки здесь: http://delphi.about.com/od/delphitips2009/qt/sort-generic.htm
Имейте в виду, что это будет O(N) для итерации, где N - это не только количество элементов в базе данных, но и количество сегментов в хэш-таблице. Затем возникают дополнительные затраты на получение данных из базы данных для каждого элемента, и, наконец, O(NLogN) для быстрой сортировки.
TDictionary, как и все хеш-таблицы, предназначен для поиска, он хорош в этом и плох в других задачах, таких как итерация или даже сортировка. Если вы хотите ускорить это, используйте отдельный список, отсортированный по соответствующему ключу, так что вы можете просто перебрать уже отсортированный список и получить данные из БД. Если сортировка действительно важна и выполняется много раз, тогда используйте бинарные деревья вместо хеш-таблиц. Вы можете иметь одно двоичное дерево для каждого поля поиска. Под двоичными деревьями я имею в виду сбалансированные двоичные деревья, такие как дерево AVL.
Например, двоичные деревья хороши для этого, потому что они остаются отсортированными по вставкам. Не могу помочь вам больше без дополнительных данных.