Convert NSArray to NSDictionary

后端 未结 6 1966
清酒与你
清酒与你 2020-12-02 22:13

How can I convert an NSArray to an NSDictionary, using an int field of the array\'s objects as key for the NSDictionary?

相关标签:
6条回答
  • 2020-12-02 22:53

    This adds a category extension to NSArray. Needs C99 mode (which is the default these days, but just in case).

    In a .h file somewhere that can be #imported by all..

    @interface NSArray (indexKeyedDictionaryExtension)
    - (NSDictionary *)indexKeyedDictionary
    @end
    

    In a .m file..

    @implementation NSArray (indexKeyedDictionaryExtension)
    
    - (NSDictionary *)indexKeyedDictionary
    {
      NSUInteger arrayCount = [self count];
      id arrayObjects[arrayCount], objectKeys[arrayCount];
    
      [self getObjects:arrayObjects range:NSMakeRange(0UL, arrayCount)];
      for(NSUInteger index = 0UL; index < arrayCount; index++) { objectKeys[index] = [NSNumber numberWithUnsignedInteger:index]; }
    
      return([NSDictionary dictionaryWithObjects:arrayObjects forKeys:objectKeys count:arrayCount]);
    }
    
    @end
    

    Example use:

    NSArray *array = [NSArray arrayWithObjects:@"zero", @"one", @"two", NULL];
    NSDictionary *dictionary = [array indexKeyedDictionary];
    
    NSLog(@"dictionary: %@", dictionary);
    

    Outputs:

    2009-09-12 08:41:53.128 test[66757:903] dictionary: {
        0 = zero;
        1 = one;
        2 = two;
    }
    
    0 讨论(0)
  • 2020-12-02 22:56
    - (NSDictionary *) indexKeyedDictionaryFromArray:(NSArray *)array 
    {
      id objectInstance;
      NSUInteger indexKey = 0U;
    
      NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init];
      for (objectInstance in array)
        [mutableDictionary setObject:objectInstance forKey:[NSNumber numberWithUnsignedInt:indexKey++]];
    
      return (NSDictionary *)[mutableDictionary autorelease];
    }
    
    0 讨论(0)
  • 2020-12-02 22:59

    This is an example of creating a NSMutableDictionary from the employee list NSMutableArray:

     NSMutableArray *emloyees = [[NSMutableArray alloc]initWithObjects:@"saman",@"Ruchira",@"Rukshan",@"ishan",@"Harsha",@"Ghihan",@"Lakmali",@"Dasuni", nil];
    
     NSMutableDictionary *dict = [NSMutableDictionary dictionary];
     for (NSString *word in emloyees) {
     NSString *firstLetter = [[word substringToIndex:1] uppercaseString];
     letterList  = [dict objectForKey:firstLetter];
    
    if (!letterList) {
        letterList = [NSMutableArray array];
        [dict setObject:letterList forKey:firstLetter];
    }
    [letterList addObject:word];}  NSLog(@"dic %@",dict);
    
    0 讨论(0)
  • 2020-12-02 23:04
    - (NSDictionary *) indexKeyedDictionaryFromArray:(NSArray *)array
    {
        NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init];
        [array enumerateObjectsUsingBlock:
         ^(id obj, NSUInteger idx, BOOL *stop){
             NSNumber *index = [NSNumber numberWithInteger:idx];
             [mutableDictionary setObject:obj forKey:index];
         }];
        NSDictionary *result = [NSDictionary.alloc initWithDictionary:mutableDictionary];
        return result;
    }
    
    0 讨论(0)
  • 2020-12-02 23:08

    I have created a simple library, called Linq to ObjectiveC, which is a collection of methods that makes this kind of problem much easier to solve. In your case you need the Linq-to-ObjectiveC toDictionary method, where your 'int' field is specified via a key selector:

    NSDictionary* dictionary = [sourceArray toDictionaryWithKeySelector:^id(id item) {
        return [item intField];
    }];
    

    This returns a dictionary where the keys are given by the intField in the source array.

    0 讨论(0)
  • 2020-12-02 23:09

    Try this magic:

    NSDictionary *dict = [NSDictionary dictionaryWithObjects:records 
                                       forKeys:[records valueForKey:@"intField"]];
    

    FYI this is possible because of this built-in feature:

    @interface NSArray(NSKeyValueCoding)
    
    /* Return an array containing the results of invoking -valueForKey: 
    on each of the receiver's elements. The returned array will contain
    NSNull elements for each instance of -valueForKey: returning nil.
    */
    - (id)valueForKey:(NSString *)key;
    
    0 讨论(0)
提交回复
热议问题