2012-04-26 7 views
3

私はTDictionaryを持っています。それは大規模なループでいっぱいです。ループが終了すると、スコア(整数)が多い10個のキー(文字列)を取得する必要があります。これを達成する最も効率的な方法は何でしょうか?ジェネリックコレクションのトップダウンを反復する(TDictionary)

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

し、新しいソートされた配列を反復:Objective-Cの(ココア)私がそれを行うには

。 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

Davidありがとう!元のObj-Cコードと同じくらい効率的です。辞書は大きくなりますが、このコードの使用は頻繁ではありません。 –

+1

辞書が本当に大きい場合は、値のリスト全体を並べ替えることはできません。あなたは*部分的な並べ替え*が必要です。 Wikipediaの* select algorithm *の項目を参照してください。[最小または最大のk要素を選択する](http://en.wikipedia.org/wiki/Selection_algorithm#Selecting_k_smallest_or_largest_elements) –

+0

TArray にはいつSortメソッドがありますか? –

0

マップ(辞書)としてアクセスする必要がありますか、またはプレーンな配列で十分ですか?

地図として持っていなければならない場合は、DeHL.Collections、おそらくDeHL.Collections.DoubleSortedBidiMapをご覧ください。プロジェクトページには生産が中止されていると書かれていますが、私は毎日それを使用しているので問題はありません。

+0

強力なコレクションライブラリを持っていて、活発に開発されているhttp://code.google.com/p/delphi-spring-framework/をご覧ください。 –

+0

DeHLの著者が協力していると思いますそこ。 –

+0

ポールは彼にコミット権を与えたが、私が正しく覚えていれば、アレックスは私が知っているどのような形でも活発ではなかった。 –