web-dev-qa-db-fra.com

Filtrer le tableau par la première lettre de la propriété string

J'ai un NSArray avec des objets qui ont une propriété name.

Je voudrais filtrer le tableau par 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];

Mais je reçois une erreur - "Impossible de faire une opération de sous-chaîne avec quelque chose qui n'est pas une chaîne (lhs = <1, Arrow> rhs = A)"

Comment puis-je faire ceci? Je voudrais filtrer le tableau pour la première lettre dans name étant 'A'.

16
Nubaslon

Essayez avec le code suivant

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

Édité:

NSPredicate motif devrait être:

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

Voici l'une des utilisations de base de NSPredicate pour filtrer un tableau.

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);
10
Arvind

NSArray offre un autre sélecteur pour trier les tableaux:

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

Si vous voulez filter array regardez ce code:

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

Mais si vous voulez sort array, jetez un œil aux fonctions suivantes:

- (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;
1
Sergey Demchenko

Commander cette bibliothèque

https://github.com/BadChoice/Collection

Il contient de nombreuses fonctions de tableau faciles à ne jamais écrire une boucle

Alors tu peux juste faire

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

Ceci ne récupère que les textes commençant par A triés alphabétiquement

Si vous le faites avec des objets:

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

visitez https://developer.Apple.com/library/mac/documentation/Cocoa/Conceptual/Collections/Articles/Arrays.html

utilisez ceci

[listArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
0
SreeHarsha