Фильтровать массив с помощью первой буквы свойства строки

У меня есть NSArray с объектами, имеющими свойство name.

Я хотел бы фильтровать массив на name

    NSString *alphabet = [agencyIndex objectAtIndex:indexPath.section];
    //---get all states beginning with the letter---
    NSPredicate *predicate =
    [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
    NSMutableArray *listSimpl = [[NSMutableArray alloc] init];
    for (int i=0; i<[[Database sharedDatabase].agents count]; i++) {
        Town *_town = [[Database sharedDatabase].agents objectAtIndex:i];
        [listSimpl addObject:_town];
    }
    NSArray *states = [listSimpl filteredArrayUsingPredicate:predicate];

Но я получаю сообщение об ошибке - "Не могу выполнить операцию подстроки с чем-то, что не является строкой (lhs = < 1, Arrow > rhs = A)"

Как я могу это сделать? Я хотел бы отфильтровать массив для первой буквы в name как "A".

Ответы

Ответ 1

Попробуйте выполнить следующий код

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF like %@", yourName];
NSArray *filteredArr = [yourArray filteredArrayUsingPredicate:pred];

EDITED:

NSPredicate шаблон должен быть:

NSPredicate *pred =[NSPredicate predicateWithFormat:@"name beginswith[c] %@", alphabet];

Ответ 2

Вот одно из основных применений NSPredicate для фильтрации массива.

NSMutableArray *array =
[NSMutableArray arrayWithObjects:@"Nick", @"Ben", @"Adam", @"Melissa", @"arbind", nil];

NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b'"];
NSArray *beginWithB = [array filteredArrayUsingPredicate:sPredicate];
NSLog(@"beginwithB = %@",beginWithB);

Ответ 3

NSArray предлагает другой селектор для сортировки массивов:

NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(Person *first, Person *second) {
    return [first.name compare:second.name];
}];

Ответ 4

Если вы хотите, чтобы массив фильтр взглянул на этот код:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", @"qwe"];
NSArray *result = [self.categoryItems filteredArrayUsingPredicate:predicate];

Но если вы хотите массив сортировать, посмотрите на следующие функции:

- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context;
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context hint:(NSData *)hint;
- (NSArray *)sortedArrayUsingSelector:(SEL)comparator;

Ответ 6

Оформить заказ этой библиотеки

https://github.com/BadChoice/Collection

Он поставляется с множеством простых функций массива, чтобы никогда не писать цикл снова

Итак, вы можете просто сделать

NSArray* result = [thArray filter:^BOOL(NSString *text) {
    return [[name substr:0] isEqualToString:@"A"]; 
}] sort];

Это получает только тексты, начинающиеся с сортировки в алфавитном порядке

Если вы делаете это с объектами:

NSArray* result = [thArray filter:^BOOL(AnObject *object) {
    return [[object.name substr:0] isEqualToString:@"A"]; 
}] sort:@"name"];