在复杂的评分过程中,我有一个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。有人能建议一种更快、更灵活、更原生的方法吗?
您不能对字典进行排序。唯一具有内置排序功能的可比较结构是Judy数组。然而,你可以对字典指向的项目进行排序。如果我理解正确的话,你似乎已经对关键字进行了排序。现在,如果你想按不同的东西排序,你也可以对其他数据执行同样的操作。算法是:
- 定义一个类或记录,其中包含与您相关的所有数据
- 将TDictionary项迭代或枚举到通用TList中,并使用数据库中的数据为每个项填充类或记录
- 根据适当的标准对TList中的项目进行排序。您可以在此处看到这样的排序示例:http://delphi.about.com/od/delphitips2009/qt/sort-generic.htm
请记住,对于迭代,这将是O(N),其中N不仅是数据库中的项目数,而且是哈希表中的存储桶数。然后是从数据库中为每个项目获取数据的额外开销,最后是用于快速排序的O(NLogN)
TDictionary因为所有哈希表都是用于查找的,所以它擅长查找,而不擅长迭代甚至排序等其他任务。如果您想加快速度,请使用一个按适当键排序的单独列表,这样您就可以迭代已经排序的列表,并从DB中获取数据。如果排序真的很重要并且做了很多次,那么就使用二叉树而不是哈希表。每个搜索字段可以有一个二叉树。对于二叉树,我指的是像AVL树这样的平衡二叉树。
例如,二叉树很好,因为它们在插入时保持排序。如果没有进一步的数据,无法为您提供更多帮助。