Question

I wrote a method to search for people in address book, and I want the method to be able to find "john bigs" even if I call the method [someAdressBook searchName:@"joh"];.

My method works for full names, but Im having issues in the partial names, this is my code:

-(NSMutableArray *) searchName:(NSString *) someName{

    NSRange range;

    NSMutableArray *results = [[NSMutableArray alloc] init];

    for (AddressCards *addressCard in book)
    {
        if (someName != nil && [someName caseInsensitiveCompare:addressCard.name] == NSOrderedSame)
            [results addObject:addressCard.name];

        else {
            range = [addressCard.name rangeOfString:someName];
            if (range.location != NSNotFound)
            [results addObject:addressCard.name];
        }
    }

    NSLog(@"%@", results);

    return results;
}

Please help me get this right.

Was it helpful?

Solution

You can do the search in a case-insensitive manner using -[NSString rangeOfString:options:], so you can do it in one step:

for (AddressCards *addressCard in book)
{
    if ([addressCard.name rangeOfString:someName options:NSCaseInsensitiveSearch].location != NSNotFound)
    {
        [results addObject:addressCard.name];
    }
}

OTHER TIPS

You can use NSPredicate like this:

-(NSMutableArray *) searchName:(NSString *) someName {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY addressCard.name CONTAINS[c] %@", someName];
    return [NSMutableArray arrayWithArray:[book filteredArrayUsingPredicate:predicate]];
}

The trick here is the [c]. This is equivalent to case insensitive.

Notice that I'm supposing that book is of NSArray type, if it is of NSMutableArray, using predicate will filter the "original" array.

you could use this

BOOL containsName = [[addressCard.name lowercaseString] containsSubstring: [someName lowercaseString]];
if(containsName)
    [results addObject:addressCard.name];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top