Как отсортировать NSPredicate - PullRequest
       19

Как отсортировать NSPredicate

12 голосов
/ 04 августа 2011

Я пытаюсь отсортировать массив при использовании NSPredicate. Я читал другие места, где возможно использование NSSortDescriptor. Возникли проблемы с выяснением этого.

Я пытаюсь отсортировать массив по companyName.

Любой совет приветствуется, спасибо

Грег

- (void)filterSummaries:(NSMutableArray *)all byNameThenBooth:(NSString*) text results:(NSMutableArray *)results
{
    [results removeAllObjects];

    if ((nil != text) && (0 < [text length])) {        
        if ((all != nil) && (0 < [all count])) {
            NSPredicate *predicate = [NSPredicate predicateWithFormat: @"companyName contains[cd] %@ OR boothNumber beginswith %@", text, text];
            [results addObjectsFromArray:[all filteredArrayUsingPredicate:predicate]];        
        }
    }
    else {
        [results addObjectsFromArray:all];
    }
}

Ответы [ 2 ]

33 голосов
/ 04 августа 2011

у вас есть несколько вариантов сортировки массива:

Я покажу подход, основанный на NSSortDescriptor.

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                                  @"companyName contains[cd] %@ OR boothNumber beginswith %@",
                                  text,
                                  text];

// commented out old starting point :)
//[results addObjectsFromArray:[all filteredArrayUsingPredicate:predicate]];

// create a descriptor
// this assumes that the results are Key-Value-accessible
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"companyName" 
                                                             ascending:YES];
//
NSArray *results = [[all filteredArrayUsingPredicate:predicate]  
                     sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];

// the results var points to a NSArray object which contents are sorted ascending by companyName key

Это должно сделать вашу работу.

4 голосов
/ 04 августа 2011

Функция filteredArrayUsingPredicate: проходит по вашему массиву и копирует все объекты, которые соответствуют предикату, в новый массив и возвращает его. Это не обеспечивает никакой сортировки. Это скорее поиск.

Используйте функции сортировки NSArray, а именно sortedArrayUsingComparator:, sortedArrayUsingDescriptors:, sortedArrayUsingFunction:context: и т. П., В зависимости от того, что вам больше подходит.

Оформить заказ Ссылка на класс NSArray для получения более подробной информации.

Кстати: если вы хотите сортировать лексически, вы можете использовать sortedArrayUsingSelector:@selector(compare:), который будет использовать функцию compare: NSString, чтобы найти правильный порядок.

...