【问题标题】:Iterate generic collection top down (TDictionary)自上而下迭代通用集合(TDictionary)
【发布时间】:2012-04-26 14:25:02
【问题描述】:

我有一本 TDictionary。它充满了广泛的循环。当循环完成时,我需要用更多的分数(整数)检索 10 个键(字符串)。实现这一目标的最有效方法是什么?

在 Objective-C(Cocoa) 中我这样做:

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

然后迭代新的排序数组。在 Delphi 中怎么做?

【问题讨论】:

    标签: delphi sorting collections delphi-xe


    【解决方案1】:

    与您的 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
      )
    );
    

    如果您的字典非常大,那么这将不是最有效的解决方案。另一方面,它可能是最快、最容易实施的方法。

    【讨论】:

    • 谢谢大卫!它与原始的 Obj-C 代码一样高效。字典会变大,但这段代码的使用并不频繁。
    • 如果字典真的很大,那么您可能不想对整个值列表进行排序。你只需要一个部分排序。请参阅 Wikipedia 中的 selection algorithm 条目,位于 Selecting k smallest or largest elements
    • TArray什么时候有了Sort方法?
    【解决方案2】:

    您需要将其作为地图(字典)访问,还是纯数组就足够了?

    如果您必须将其作为地图,我会看看DeHL.Collections,也许DeHL.Collections.DoubleSortedBidiMap 可以满足您的需求。项目页面说它已停产,但我每天都使用它,从来没有问题。

    【讨论】:

    • 你可能想看看code.google.com/p/delphi-spring-framework,它也有一个强大的收藏库并且它正在积极开发中
    • 认为DeHL作者正在那里合作。
    • 保罗给了他提交权限,但如果我没记错的话,亚历克斯并没有以我所知道的任何形式活跃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 2017-04-09
    • 2020-08-10
    • 2014-12-27
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多