Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

fast enumeration for NSDictionary instance ordered by the key

Overview

  • I am using fast enumeration to iterate through an NSDictionary instance
  • I expected the NSDictionary instance to be enumerated based on the ascending order of the key but that doesn't seem to be the case

What I want to do:

  • I want to be able iterate through the NSDictionary instance in the ascending order of the key using fast enumeration

Note: Pls see expected output vs actual output

Questions

  1. Am i making a mistake with my implementation ?
  2. Does NSDictionary's fast enumeration guarantee ordering based on keys ?
  3. If not then is there a work around for this and yet use fast enumeration ?

Example

#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);
}

Expected Output

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

Actual Output

key = 0x1e83     [key intValue] = 30     value = CCC
key = 0xa83      [key intValue] = 10     value = AAA
key = 0x1483     [key intValue] = 20     value = BBB
like image 396
user1046037 Avatar asked Dec 04 '22 18:12

user1046037


2 Answers

for (NSString *key in [[d1 allKeys] sortedArrayUsingSelector:@selector(compare:)])
{
    id value = [d1 valueForKey:key];
    ...
}
like image 171
NSResponder Avatar answered Jan 10 '23 17:01

NSResponder


  1. No your implementation is correct.
  2. NSDictionary fast enumeration does not guarantee sorting (and it will not output anything in order because of implementation as hashed container).
  3. No, you have to sort it yourself.
like image 39
Dani Avatar answered Jan 10 '23 16:01

Dani