NSArray сортировать и изолировать - PullRequest
2 голосов
/ 24 января 2010

У меня есть NSArray имен, я хочу отсортировать их в алфавитном порядке в UITableView и разделить их на разделы.

У меня есть помеченный раздел сверху, являющийся разделом 0. Я хочу, чтобы имена, отсортированные в алфавитном порядке, шли после этого. Таким образом, все имена, начинающиеся с A, помещаются в раздел 1, B - в раздел 2 и т. Д.

Мне нужно каким-то образом получить количество строк для каждого раздела, а затем поместить объекты в каждый раздел.

Как мне это сделать?

Ответы [ 3 ]

3 голосов
/ 24 января 2010

Вот метод для категории в NSArray, чтобы сделать группировку:

@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

Вы можете использовать это так:

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 голос
/ 16 октября 2011

Я изменил ответ St3fans, чтобы он был немного более современным и вместо этого работал с Блоков:

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

Вы можете использовать это так:

NSArray *grouped = [arrayToGroup groupUsingBlock:^NSString *(id object) {
        return [object valueForKey:@"name"];
}];
0 голосов
/ 24 января 2010

Вам, вероятно, следует создать массив массивов, по одному для каждой буквы, и таким образом хранить свои имена. В то время как вы можете использовать один массив для хранения данных, быстрого способа выполнить необходимую вам сегментацию не существует. Сортировка, конечно, но не секционирование.

...