2010-01-24 6 views
2

J'ai un NSArray de noms, je veux les classer par ordre alphabétique dans un UITableView et les séparer en sections.NSArray trier et isoler

J'ai une section étiquetée en haut, étant la section 0. Je veux que les noms triés aplhabétiquement à venir après cela. Donc, tous les noms commençant par A sont placés dans la section 1, B dans la section 2, et ainsi de suite.

Je dois être en mesure d'obtenir le nombre de lignes pour chaque section, puis placer les objets dans chaque section.

Comment faire?

Répondre

0

Vous devriez probablement créer un tableau de tableaux, un pour chaque lettre, et stocker vos noms de cette façon. Alors que vous pouvez utiliser un seul tableau pour le stockage, il n'y a pas de moyen rapide de faire la segmentation que vous recherchez. Le tri, certes, mais pas la sectionisation.

3

Voici une méthode pour une catégorie sur NSArray à faire groupement:

@interface NSArray (Grouping) 
- (NSArray*) groupUsingFunction: (id (*)(id, void*)) function context: (void*) context; 
@end 

@implementation NSArray (Grouping) 
- (NSArray*) groupUsingFunction: (id (*)(id, void*)) function context: (void*) context 
{ 
    NSArray* groupedArray = nil; 

    NSMutableDictionary* dictionary = [NSMutableDictionary new]; 
    if (dictionary != nil) 
    { 
     for (id item in self) 
     { 
      id key = function(item, context); 
      if (key != nil) 
      { 
       NSMutableArray* array = [dictionary objectForKey: key]; 
       if (array == nil) { 
        array = [NSMutableArray arrayWithObject: item]; 
        if (array != nil) { 
         [dictionary setObject: array forKey: key]; 
        } 
       } else { 
        [array addObject: item]; 
       } 
      } 
     } 

     groupedArray = [NSMutableArray arrayWithArray: [dictionary allValues]]; 
     [dictionary release]; 
    } 

    return groupedArray; 
} 
@end 

Vous pouvez l'utiliser comme ceci:

id GroupNameByFirstLetter(NSString* object, void* context) 
{ 
    return [object substringToIndex: 1]; 
} 

NSInteger SortGroupedNamesByFirstLetter(id left, id right, void* context) 
{ 
    return [[left objectAtIndex: 0] characterAtIndex: 0] - [[right objectAtIndex: 0] characterAtIndex: 0]; 
} 

NSMutableArray* names = [NSArray arrayWithObjects: @"Stefan", @"John", @"Alex", 
    @"Sue", @"Aura", @"Mikki", @"Michael", @"Joe", @"Steve", @"Mac", @"Fred", 
    @"Faye", @"Paul", nil]; 

// Group the names and then sort the groups and the contents of the groups. 

groupedNames_ = [[names groupUsingFunction: GroupNameByFirstLetter context: nil] retain]; 

[groupedNames_ sortUsingFunction: SortGroupedNamesByFirstLetter context: nil]; 

for (NSUInteger i = 0; i < [groupedNames_ count]; i++) { 
    [[groupedNames_ objectAtIndex: i] sortUsingSelector: @selector(compare:)]; 
} 
1

J'ai modifié St3fans réponse à être un peu plus moderne et le travail avec blocs au lieu:

@interface NSArray (Grouping) 
- (NSArray*) groupUsingBlock:(NSString* (^)(id object)) block; 
@end 


- (NSArray*) groupUsingBlock:(NSString* (^)(id object)) block 
{ 
    NSArray* groupedArray = nil; 

    NSMutableDictionary* dictionary = [NSMutableDictionary new]; 
    if (dictionary != nil) 
    { 
     for (id item in self) 
     { 
      id key = block(item); 
      if (key != nil) 
      { 
       NSMutableArray* array = [dictionary objectForKey: key]; 
       if (array == nil) { 
        array = [NSMutableArray arrayWithObject: item]; 
        if (array != nil) { 
         [dictionary setObject: array forKey: key]; 
        } 
       } else { 
        [array addObject: item]; 
       } 
      } 
     } 

     groupedArray = [NSMutableArray arrayWithArray: [dictionary allValues]]; 
     [dictionary release]; 
    } 

    return groupedArray; 
} 

Vous pouvez l'utiliser comme ceci:

NSArray *grouped = [arrayToGroup groupUsingBlock:^NSString *(id object) { 
     return [object valueForKey:@"name"]; 
}];