从上到下迭代通用集合(TDictionary)

3

我有一个TDictionary。它正在通过一个大循环填充。当循环结束后,我需要检索得分更高的前10个键(字符串)。最有效的方法是什么?

在Objective-C(Cocoa)中,我使用以下代码:

NSArray *top_words_sorted_array = [top_words_dictionary keysSortedByValueUsingSelector:@selector(compare:)];

如何在Delphi中对新排序的数组进行迭代?

2个回答

5

您的Cocoa代码相应的Delphi代码如下:

type
  TScorePair = TPair<string,Integer>;
var
  ScoresArray: TArray<TScorePair>;
....
ScoresArray := Scores.ToArray;
TArray.Sort(ScoresArray,
  TComparer<TScorePair>.Construct( 
    function(const L, R: TScorePair): Integer
    begin
      Result := R.Value - L.Value;
    end
  )
);

如果你的字典很大,那么这可能不是最有效的解决方案。另一方面,它可能是实现起来最快、最简单的方法。

谢谢你,David!这段代码和原始的 Obj-C 代码一样高效。虽然字典会变得很大,但是这段代码的使用并不频繁。 - Miguel E
1
如果字典非常大,那么您可能不想对整个值列表进行排序。您只需要进行部分排序。请参阅维基百科中的选择算法条目,位于选择k个最小或最大元素下。 - Rob Kennedy
TArray<T> 从何时开始拥有 Sort 方法? - Stefan Glienke

0
你需要将它作为映射(字典)来访问还是普通数组就足够了?
如果必须将其作为映射,我建议看看DeHL.Collections,也许DeHL.Collections.DoubleSortedBidiMap正好符合您的需求。该项目页面上说已停止更新,但我每天都在使用它,并且从未出现问题。

你可能想要查看 http://code.google.com/p/delphi-spring-framework/,它还拥有强大的集合库,并且正在积极开发中。 - Stefan Glienke
我认为DeHL的作者正在那里合作。 - Leonardo Herrera
Paul 给了他提交权限,但如果我没记错的话,Alex 在我所知道的任何形式上都没有活跃。 - Stefan Glienke

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