将TDictionary排序后正确处理并转化为数组的方法

5

我有一个类似于 TDictionary 的数据结构

target_results : TDictionary<longint,double>;

在将其填充后,我需要对结果进行排序。 我是这样做的:
type
  TSearchResult = TPair<longint,double>;

var
 target_results_array : TArray<TSearchResult>;

target_results_array:= target_results.ToArray;
TArray.Sort<TSearchResult>(best_knowledge_search_results,
                    TComparer<TSearchResult>.Construct(
                              function(const L, R: TSearchResult): Integer
                              begin
                                if L.Value < R.Value then Result := 1 else if L.Value > R.Value then Result := -1 else Result := 0;
                              end
                    ));

一切都按预期运行。我的问题是如何在没有任何泄漏的情况下处理TDictionary和TArray?目前我只是这样做:

target_results.Free;

我不明白为什么你要使用字典。这看起来应该是TList<T>。 - David Heffernan
3
@DavidHeffernan 我正在执行一些查询来确定最终得分。每个查询都会带来一组小计分数。我使用TDictionary.AddOrSetValue将新条目添加或将小计分数添加到现有键中。你认为这是适合这种情况最高效的结构吗?谢谢! - Miguel E
1
如果你正在进行关键字查找,那么字典数据结构是很好的选择。当然,这一点不在问题中,因此我提出了查询。但是看起来你已经选用了正确的数据结构。 - David Heffernan
2
只是为了澄清:AddOrSetValue并不会将子总和添加到现有值中,它只是用新的子总和覆盖任何现有值。 - Uwe Raabe
@UweRaabe 谢谢。在添加小计之前,我使用TryGetValue来检索可能已经存在的值。 - Miguel E
这让我想起我们的集合单元是多么的糟糕 :-( 这个问题呼唤着一个默认字典实现。即使没有它,如果我们有一个函数,在找不到键时返回指定值,你可以像这样做总计:target_results.Items(index) := target_results.get(index, 0) + subtotal。实际上由于items存在异常,我们将会使用 target_results.AddOrSetValue(index, target_results.get(index, 0) + 1)。呕... TDictionary 需要大量的工作。我们还需要一个根据键值排序的函数,而不是自定义比较函数,这样你就可以在一行内排序了。 - alcalde
1个回答

6

由于你的数据是长整型和双精度浮点数,都是值类型,所以释放字典将会很好地工作。你的数组将包含原始值的副本,你不需要担心丢失或损坏任何内容。

如果你有对象类型,并且你有一个拥有对象的TObjectDictionary,那么你就必须担心这种情况,但对于纯数值数据,你是安全的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接