Лучшие варианты сортировки записей на основе 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 ответ

Решение

Вы не можете отсортировать словарь. Единственная сопоставимая структура со встроенной сортировкой - массив Джуди. Однако вы можете сортировать элементы, на которые указывает словарь. Кажется, вы уже отсортировали ключи, если я вас правильно понял. Теперь вы делаете то же самое для других данных, если хотите отсортировать что-то другое. Алгоритм будет:

  1. Определите класс или запись, содержащую все данные, которые важны для вас
  2. Итерируйте или перечисляйте элементы TDictionary в общий TList и для каждого элемента заполняйте класс или запись данными из базы данных.
  3. Сортируйте элементы в TList по соответствующим критериям. Вы можете увидеть пример такой сортировки здесь: http://delphi.about.com/od/delphitips2009/qt/sort-generic.htm

Имейте в виду, что это будет O(N) для итерации, где N - это не только количество элементов в базе данных, но и количество сегментов в хэш-таблице. Затем возникают дополнительные затраты на получение данных из базы данных для каждого элемента, и, наконец, O(NLogN) для быстрой сортировки.

TDictionary, как и все хеш-таблицы, предназначен для поиска, он хорош в этом и плох в других задачах, таких как итерация или даже сортировка. Если вы хотите ускорить это, используйте отдельный список, отсортированный по соответствующему ключу, так что вы можете просто перебрать уже отсортированный список и получить данные из БД. Если сортировка действительно важна и выполняется много раз, тогда используйте бинарные деревья вместо хеш-таблиц. Вы можете иметь одно двоичное дерево для каждого поля поиска. Под двоичными деревьями я имею в виду сбалансированные двоичные деревья, такие как дерево AVL.

Например, двоичные деревья хороши для этого, потому что они остаются отсортированными по вставкам. Не могу помочь вам больше без дополнительных данных.

Другие вопросы по тегам