45 votes

Conversion de NSArray en NSDictionary

Comment puis-je convertir un NSArray à un NSDictionary en utilisant un champ de type int des objets du tableau comme clé pour l'analyse des données. NSDictionary ?

75voto

malcolmhall Points 1909

Essayez cette magie :

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

Pour votre information, cela est possible grâce à cette fonctionnalité intégrée :

@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;

53voto

Alex Reynolds Points 45039
- (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];
}

9voto

johne Points 5957

Cela ajoute une extension de catégorie à NSArray . Besoins C99 (qui est le mode par défaut de nos jours, mais juste au cas où).

Dans un .h quelque part qui peut être #import par tous.

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

Dans un .m fichier..

@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

Exemple d'utilisation :

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

NSLog(@"dictionary: %@", dictionary);

Sorties :

2009-09-12 08:41:53.128 test[66757:903] dictionary: {
    0 = zero;
    1 = one;
    2 = two;
}

1voto

AcornHacks Points 11
- (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;
}

-1voto

ColinE Points 36907

J'ai créé une bibliothèque simple, appelée Linq à ObjectiveC qui est un ensemble de méthodes permettant de résoudre ce type de problème plus facilement. Dans votre cas, vous avez besoin de la méthode Dictionnaire Linq-to-ObjectiveC toDictionary où votre champ "int" est spécifié par un sélecteur de clé :

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

Cela renvoie un dictionnaire dont les clés sont données par l'option intField dans le tableau source.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X