2012-04-26 11 views
3

我有一個TDictionary。它充滿了廣泛的循環。當循環完成時,我需要獲得更多分數(整數)的10個鍵(字符串)。什麼是最有效的方法來完成這個?迭代泛型集合自上而下(TDictionary)

在Objective-C(可可)我用做:

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

,然後重複所述新排序後的數組。我怎樣才能在Delphi中做到這一點?

回答

5

等效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 
) 
); 

如果你的字典裏是非常大的,那麼這將不會是最有效的解決方案。另一方面,這可能是最快最容易實現的方法。

+0

謝謝大衛!它和原始的Obj-C代碼一樣高效。字典會變大,但這種代碼使用並不經常。 – 2012-04-26 15:51:34

+1

如果字典真的很大,那麼您可能不想對整個值列表進行排序。你只需要一個*部分排序*。參見[選擇k最小或最大元素](http://en.wikipedia.org/wiki/Selection_algorithm#Selecting_k_smallest_or_largest_elements)下維基百科中的*選擇算法*條目 – 2012-04-26 17:57:57

+0

從何時起,TArray 有一個Sort方法? – 2012-04-26 22:34:40

0

您是否需要將它作爲映射(字典)或普通數組訪問?

如果你必須把它作爲地圖,我會看看DeHL.Collections,或許DeHL.Collections.DoubleSortedBidiMap做你所需要的。該項目頁面說,它已停產,但我每天都在使用它,永遠不會有問題。

+0

您可能想要看看http://code.google.com/p/delphi-spring-framework/,它也有一個強大的收集庫,並且它是積極開發的 – 2012-04-26 20:47:20

+0

我認爲DeHL作者正在合作那裏。 – 2012-04-27 14:49:51

+0

保羅給了他承諾的權利,但如果我沒記錯的話,亞歷克斯沒有以我知道的任何形式活躍。 – 2012-04-28 21:47:25