1

forinループを介してNSDictionaryを反復しようとしています。しかし、私はそれがこのコレクションの終わりから最初まで反復を開始することを望んでいます。この復帰をどのように実装できますか?

4

3 に答える 3

7

NSDictionary順序付けられていないデータ構造です。順方向反復または逆方向反復の概念はありません。

foreachループでNSDictionaryを呼び出すと、順序付けされていないキーのリストを反復処理します。順序付けされていないリストを反復処理する場合、順序は定義されていないため、順序が逆になります。これは、トランプを床に散らして、誰かに順番を逆にするように頼むのと似ています。

キーに何らかの順序階層(数値、アルファベット順など)があると仮定すると、代わりにキーコレクションを取得し、それを特定の順序に並べ替えてから、キーコレクションを反復するか、逆に反復することができます。ただし、これが頻繁に実行する操作である場合はNSDictionary、問題のデータ構造に最適な選択ではないと思います。

于 2012-11-30T17:28:40.543 に答える
6

うーん...問題は、NSDictionaryが本質的に順序付けられていないことです。

したがって、考えられる解決策は、キーを使用してNSArrayを作成し、その配列を「reverseObjectEnumerator」で反転してから、配列をループしてディクショナリでキーを使用することです。

このようなもの:

NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
                       @"firstValue",@"firstKey",
                       @"secondValue",@"secondKey",
                       @"thirdValue",@"thirdKey",
                       nil];

NSArray *keysNormal   = [_dict allKeys];
NSArray *keysReversed = [[[_dict allKeys] reverseObjectEnumerator] allObjects];

for(NSString *str in keysNormal)
{
    NSLog(@"%@", [_dict objectForKey:str]);
}

for(NSString *str in keysReversed)
{
    NSLog(@"%@", [_dict objectForKey:str]);
}

ログは次のとおりです。

  • thirdValue
  • secondValue
  • firstValue
  • firstValue
  • secondValue
  • thirdValue
于 2012-11-30T17:34:54.167 に答える
1
NSArray * a = @[@"a",@"b",@"c"];
NSArray * b = [[a reverseObjectEnumerator] allObjects];
for (NSString * obj in b) {
    NSLog(@"%@",obj);
}

c、b、aを印刷します。次のように辞書のキーを逆にしてみてください。

NSArray * key = [[[dict allKeys] reverseObjectEnumerator] allObjects];
于 2012-11-30T17:29:06.220 に答える