web-dev-qa-db-ja.com

高速列挙型とNSDictionaryを使用すると、キーの順序での反復は保証されません。どうすれば、ISの順序で)実行できますか?

アプリが必要とするデータ(データは基本的にフィード)を使用して、応答としてNSDictionaryを送り返すAPIと通信しています。このデータは、最新のものから古いものの順に並べ替えられ、最新の項目がNSDictionaryの先頭に表示されます。

for (NSString *key in articles) { ... }を使用して高速に列挙すると、順序はランダムに見えるため、操作する順序は、希望どおりに新しいものから古いものへの順序ではなく、完全にランダムです。

読んだことがありますが、NSDictionaryで高速列挙を使用する場合、配列を順番に繰り返すことは保証されていません。

しかし、私は必要それをします。 NSDictionaryが含まれている順序でNSDictionaryを反復処理するにはどうすればよいですか?

13
Doug Smith

1つの方法は、可変配列内のすべてのキーを取得することです。

NSMutableArray *allKeys = [[dictionary allKeys] mutableCopy];

次に、必要に応じて配列を並べ替えます。

[allKeys sortUsingComparator: ....,]; //or another sorting method

次に、配列を反復処理して(ここで高速列挙を使用すると順序が維持されると思います)、現在のキーのディクショナリ値を取得できます。

for (NSString *key in allKeys) {
   id object = [dictionary objectForKey: key];
   //do your thing with the object 
 }
22
Mario

辞書は、定義上、順序付けられていません。キーに順序を適用する場合は、キーを並べ替える必要があります。

NSArray *keys = [articles allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(compare:)];
for (NSString *key in sortedKeys) {
    // process key
}

ニーズに合わせてキーの並べ替え方法を更新します。

9
rmaddy

次のように直接列挙することもできます。

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];

for (NSString* key in xyz) {
    id value = [xyz objectForKey:key];
    // do stuff
} 



これは、質問でzneakによって提供された回答から取得されます: NSMutableディクショナリにアクセスするためのObjective Cの各ループに対して

4
Hashim Akhtar

他の人が言ったように、NSDictionaryで注文を保証することはできません。また、allKeysプロパティを注文することは、本当に必要なものではない場合があります。キーがdictに挿入された順序でdictを列挙することが本当に必要な場合は、キーを格納するための新しいNSMutableArrayプロパティ/変数を作成して、キーがその順序を保持するようにすることができます。

Dictに新しいキーを挿入するたびに、それを配列に挿入します。

[articles addObject:someArticle forKey:@"article1"];
[self.keys addObject:@"article1"];

それらを順番に列挙するには、次のようにします。

for (NSString *key in self.keys) {
   id object = articles[key];
}
4
Lucas Eduardo