2010-11-19 6 views
4

私は、NSDictionaryをソートする正しい方法は、キーから配列を作成し、配列をソートし、次に配列を列挙し、そこからNSDictionaryを操作することです。NSDictionaryはメモリ内でアルファベット順になっていますが、列挙ではないのはなぜですか?

NSLog(@"%@", dict); 

しかし、これではありません:私の質問は、なぜ、このアルファベットは、文字列のキーと値を、NSDictionaryの*の辞書のために、

for (NSString *w in dict) 
{ 
    NSLog(@"%@", w); 
} 

は奇妙に思えます...私は何か間違っているのですか?

ありがとうございます。

答えて

6

"メモリ内"ではありません - %@は、dictでメッセージを呼び出させ、それをソートします。列挙は、コンテンツへの最速の生のアクセスを提供するためのものです。ソートが必要な場合は、ソートする必要があります。

最初のものは、それが簡単に、ユーザ/プログラマが見つけるために作るために、あなたが記述正確な方法で配列をソートしているためのObjective-C

http://code.google.com/p/cocoa-sorted-dictionary/

+0

ああ、意味があります。私はソートを行うNSLogの%@について考えなかった。ありがとう! – iBuys

+0

I。辞書は本質的に順序付けられていない。 – bbum

+0

辞書はある値を別の値にマッピングするコレクションの単なるインタフェースです。それは順不同である必要はありません。たとえば、バイナリツリーから辞書を作成することができます。その場合は、順序付けられます。 C++では、std :: mapに辞書インタフェースがあり、順序付けられています。ハッシュテーブルは順序付けされていないので、1つの辞書から作成された辞書も同様です。 –

2

ため、この無料のソート辞書を見てみましょうもの。ただし、下位レベルのCFCopyDescription(dict)を使用する場合は、繰り返しの順序を取得します。

Objective-Cインターフェイスがなくても、CoreFoundationコレクションのソースコードはavailableです。 NSDictionary/CFDictionaryおよびNSSet/CFSetは、CFBasicHashに基づいており、驚くことにハッシュテーブルを実装しています。 CFCopyDescription()と、メモリ順の要素(CFBasicHash.mのCFBasicHashApply()CFBasicHashGetBucket())の高速反復ループ。実際の順序付けは、ハッシュに基づいたクイックルックアップのために設計されています。ハッシュテーブルに慣れていない場合は、Wikipediaを参照してください。

+0

これも良い説明です。詳細な情報をありがとうございます。 – iBuys

関連する問題