4

概要

  • 高速列挙を使用して NSDictionary インスタンスを反復処理しています
  • キーの昇順に基づいて NSDictionary インスタンスが列挙されることを期待していましたが、そうではないようです

私がしたいこと:

  • 高速列挙を使用してキーの昇順で NSDictionary インスタンスを反復できるようにしたい

注:期待される出力と実際の出力を確認してください

質問

  1. 実装を間違えていますか?
  2. NSDictionary の高速列挙は、キーに基づく順序付けを保証しますか?
  3. そうでない場合、これに対する回避策はありますが、高速列挙を使用しますか?

#import<Foundation/Foundation.h>

int main()
{
    system("clear");

    NSDictionary *d1 = nil;

    @autoreleasepool
    {   

        d1 = [[NSDictionary alloc] initWithObjectsAndKeys: @"AAA", [NSNumber numberWithInt:10], 
              @"BBB", [NSNumber numberWithInt:20],               
              @"CCC", [NSNumber numberWithInt:30],               
              nil];
    }   

    for(NSNumber* n1 in d1)     //I expected fast enumeration for NSDictionary to be based on the 
        //ascending order of the key but that doesn't seem to be the case
    {
        printf("key = %p"
               "\t [key intValue] = %i"
               "\t value = %s\n", 
               n1, 
               [n1 intValue], 
               [[d1 objectForKey:n1] UTF8String]);
    }   

    return(0);
}

期待される出力

key = 0xa83      [key intValue] = 10     value = AAA
key = 0x1483     [key intValue] = 20     value = BBB
key = 0x1e83     [key intValue] = 30     value = CCC

実際の出力

key = 0x1e83     [key intValue] = 30     value = CCC
key = 0xa83      [key intValue] = 10     value = AAA
key = 0x1483     [key intValue] = 20     value = BBB
4

3 に答える 3

13
for (NSString *key in [[d1 allKeys] sortedArrayUsingSelector:@selector(compare:)])
{
    id value = [d1 valueForKey:key];
    ...
}
于 2011-12-16T04:24:04.053 に答える
2
  1. 実装は正しくありません。
  2. NSDictionaryの高速列挙は、並べ替えを保証しません(ハッシュ化されたコンテナーとして実装されているため、順番に何も出力されません)。
  3. いいえ、自分で並べ替える必要があります。
于 2011-12-16T04:21:58.010 に答える
1

オブジェクトを受け取る順序についての保証はありません。

allKeys
ディクショナリのキーを含む新しい配列を返します。
-(NSArray *)allKeys
戻り値
ディクショナリのキーを含む新しい配列、またはディクショナリにエントリがない場合は空の配列。
考察
配列内の要素の順序は定義されていません

したがって、私の提案は、辞書が頻繁に変更されない場合は、必要NSArrayな順序でキーを使用してキャッシュすることです。
辞書が頻繁に変更される場合は、必要なallKeysときに並べ替える必要があります。

于 2011-12-16T04:23:09.100 に答える