mufc
mufc

Reputation: 715

Find object by name in NSMutableArray

I have a generic person object with properties personName, lastName, and age. I am storing the user input into an NSMutableArray and I wanted to find a under by his/her name in the array. I have tried finding a bunch of different solutions but none that quite really work.

This is my main.m

    @autoreleasepool {
        char answer;
        char locatePerson[40];
        //Create mutable array to add users for retrieval later
        NSMutableArray *people = [[NSMutableArray alloc] init];

        do{
            Person *newPerson = [[Person alloc]init];
            [newPerson enterInfo];
            [newPerson printInfo];
            [people addObject:newPerson];

            NSLog(@"Would you like to enter another name?");
            scanf("\n%c", &answer);

        }while (answer == 'y');

        NSLog(@"Are you looking for a specific person?");
        scanf("%c", locatePerson);

        //This is where I need help
        int idx = [people indexOfObject:]

    }

This is very basic but I am new to objective-c and I wanted to try and find the user by name. The solutions I've seen have used the indexesOfObjectsPassingTest method. But I was wondering if I can't just use the indexOfObjectmethod the way I did there to locate a person by its name?

Any help is appreciated.

Upvotes: 0

Views: 388

Answers (2)

jfuellert
jfuellert

Reputation: 570

You can try something like this assuming that 'name' is a property for your Person class.

NSUInteger i = 0;
for(Person *person in people) {
    if([person.name isEqualToString:locatePerson]) {
        break;
    }
    i++;
}

Upvotes: 0

user189804
user189804

Reputation:

This is one of those hard problems you should avoid with some up-front design. If you know that you are putting things into a collection class and will need to get them out again based on some attribute (rather than by order of insertion) a dictionary is the most efficient collection class.

You can use a NSDictionary keyed with Person's name attribute. You can still iterate over all the objects but you will avoid having to search the whole collection. It can take a surprisingly long time to find a matching attribute in a NSArray! You wouldn't even have to change your Person object, just do

NSDictionary *peopleDictionary = @{ person1.name : person1, person2.name : person2 };

or add them one by one as they are created into a NSMutableArray.

Upvotes: 3

Related Questions