13

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

それらをすばやく列挙するとfor (NSString *key in articles) { ... }、順序はランダムに見えるため、それらを操作する順序は、新しいものから古いものへの順序ではなく、完全にランダムです。

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

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

4

3 に答える 3

22

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 
 }
于 2013-07-31T01:27:33.747 に答える
9

辞書は、定義上、順不同です。キーに順序を適用する場合は、キーを並べ替える必要があります。

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

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

于 2013-07-31T01:23:38.820 に答える
4

他の人が言ったように、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];
}
于 2013-07-31T01:31:04.473 に答える