Сумасшедшая сортировка массивов в tableView!sortedArrayUsingSelector поможет? - PullRequest
3 голосов
/ 17 августа 2011

Мое приложение tableView загружает данные в табличное представление. Все работает отлично, но сортировка массивов немного запутана, как вы можете видеть на рисунке ниже. Я думал об использовании sortedArrayUsingSelector, чтобы исправить положение, но я не уверен, какой «метод сортировки» мне следует использовать. You can see, the numbers don't go like 1. 2. 3. 4. 5. etc, but weird...

Как я могу отсортировать это так, чтобы ячейки сортировались по номерам? Как и порядок будет 1. 2. 3. 4. 5. и т. Д. НЕ 1. 10. 11. 12. 13. 14. 2. 3.?

Заранее большое спасибо !!

Ответы [ 3 ]

5 голосов
/ 17 августа 2011

и двухслойный:

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES comparator:^(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }];
rowTitleArray = [rowTitleArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
1 голос
/ 17 августа 2011

Вот более элегантное решение:

NSInteger intSort(id num1, id num2, void *context) {
    NSString *n1 = (NSString *) num1;
    NSString *n2 = (NSString *) num2;
    n1 = [[n1 componentsSeparatedByString:@"."] objectAtIndex:0];
    n2 = [[n2 componentsSeparatedByString:@"."] objectAtIndex:0];
    if ([n1 intValue] < [n2 intValue]) {
        return NSOrderedAscending;
    }
    else if ([n1 intValue] > [n2 intValue]) {
        return NSOrderedDescending;
    }
    return NSOrderedSame;
}

rowTitleArray = [rowTitleArray sortedArrayUsingFunction:intSort context:NULL];
1 голос
/ 17 августа 2011

Извините за этот запутанный подход, но он работает ...

NSArray *rowTitleArray = [[NSArray alloc] initWithObjects:
                          @"10. Tenth", 
                          @"15. Fifteenth", 
                          @"13. Thirteenth", 
                          @"1. First", 
                          @"2. Second", 
                          @"22. TwentySecond", nil];

NSMutableArray *dictionaryArray = [NSMutableArray array];
for (NSString *original in rowTitleArray) {
    NSString *numberString = [[original componentsSeparatedByString:@"."] objectAtIndex:0];
    NSNumber *number = [NSNumber numberWithInt:[numberString intValue]];
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                          number, @"number", original, @"rowTitle", nil];
    [dictionaryArray addObject:dict];
}
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"number" ascending:YES];
NSArray *sortedDictionaryArray = [dictionaryArray sortedArrayUsingDescriptors:
                                  [NSArray arrayWithObject:descriptor]];
NSMutableArray *sortedRowTitles = [NSMutableArray array];
for (NSDictionary *dict in sortedDictionaryArray) {
    [sortedRowTitles addObject:[dict objectForKey:@"rowTitle"]];
}
rowTitleArray = [NSArray arrayWithArray:sortedRowTitles];

NSLog(@"%@", rowTitleArray);

Вывод:

    "1. First",
    "2. Second",
    "10. Tenth",
    "13. Thirteenth",
    "15. Fifteenth",
    "22. TwentySecond"

Я попытаюсь придумать более элегантное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...