-2

从一个复杂的评分过程中,我有一个 TDictionary 结构:

target_results : TDictionary<longint, double>;

键代表 MySQL 表中记录的 id。从那个 id 我可以检索一个文件日期和一个文件名。我需要提供按以下选项之一排序的这些结果:

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。有人可以建议一种更快、更灵活、更原生的方法吗?

4

1 回答 1

1

您不能对字典进行排序。唯一可比较的内置排序结构是 Judy 数组。但是,您可以对字典指向的项目进行排序。如果我理解正确,您似乎已经对密钥进行了排序。现在,如果您想按不同的方式排序,您可以对其他数据执行相同的操作。该算法将是:

  1. 定义一个包含与您相关的所有数据的类或记录
  2. 将 TDictionary 项迭代或枚举到通用 TList 中,并为每个项用数据库中的数据填充类或记录
  3. 按适当的标准对 TList 中的项目进行排序。您可以在此处查看此类排序的示例:http: //delphi.about.com/od/delphitips2009/qt/sort-generic.htm

请记住,这将是 O(N) 迭代,其中 N 不仅是数据库中的项目数,而且是哈希表中的桶数。然后是从数据库中为每个项目获取数据的额外开销,最后有 O(NLogN) 用于快速排序。

TDictionary 因为所有的哈希表都是用来查找的,它擅长查找,不擅长其他任务,比如迭代甚至排序。如果您想加快速度,请使用按适当键排序的单独列表,这样您就可以迭代已排序的列表并从数据库中获取数据。如果排序真的很重要并且做了很多次,那么使用二叉树而不是哈希表。每个搜索字段可以有一个二叉树。对于二叉树,我的意思是平衡二叉树,如 AVL 树。

例如,二叉树对此有好处,因为它们在插入时保持排序。如果没有更多可用数据,无法为您提供更多帮助。

于 2014-02-13T14:16:12.970 回答