2010-10-21 2 views
0

Я пытаюсь обнулить NSArray из NSDictionaries на основе определенных ключей в словарях. То, что у меня есть, выглядит примерно так:De-dupe NSArray из NSDictionaries на основе определенных ключей

NSDictionary *person1 = [NSDictionary dictionaryWithObjectsAndKeys:@"John", @"firstName", @"Smith", "lastName", @"7898", @"employeeID"]; 
NSDictionary *person2 = [NSDictionary dictionaryWithObjectsAndKeys:@"Eric", @"firstName", @"Johnson", "lastName", @"1718" @"employeeID"]; 
NSDictionary *person3 = [NSDictionary dictionaryWithObjectsAndKeys:@"John", @"firstName", @"Smith", "lastName", @"1153", @"employeeID"]; 

NSMutableArray *personArray = [NSArray arrayWithObjects:person1, person2, person3, nil]; 

// insert some code to de-dupe personArray based SOLELY on the firstName and lastName keys 

Обратите внимание, что есть два сотрудника с тем же именем, но с разными идентификаторами. То, что я хотел бы сделать, это просто вернуть новый массив только с person1 и person2, так как person3 имеет те же данные - мне просто не важно значение «employeeID» в этой конкретной проблеме.

Любые идеи? Благодаря!

Матф

ответ

5

Добавить класс Person, который наследуется от NSDictionary и реализовать isEqual: игнорируя ключ ID, отбрасывая словари этому классу, затем создавайте NSSet из ваших объектов Person.

0

В данном конкретном случае я хотел бы создать временный NSMutableDictionary и добавить каждый словарь personX в качестве объекта и его значение «FirstName» 's как ключ. Таким образом, словарь personX будет заменен, если к временному добавляется другой человек X с таким же именем. Затем получите массив из временного словаря с -allValues ​​.

+0

Я ценю ваш быстрый ответ! Я думаю, что в этом случае это будет хорошо работать, единственная проблема, о которой я забыл указать, заключается в том, что я имею дело со многими тысячами упомянутых объектов человека. Ваш метод работает, хотя я не уверен, насколько он масштабируемый. – mag725

+0

Возможно, я ошибаюсь, но я понимаю, что NSDictionary ведет себя большую часть времени как хэш-карту с амортизированным временем вставки O (1). Инициализируйте словарь с емкостью, пропорциональной ожидаемому количеству уникальных записей, чтобы предотвратить повторное тестирование и протестировать его. Память тоже не должна быть проблемой, потому что то, что вы вставляете, на самом деле является ссылкой. Если у вас много записей, и вы продолжаете извлекать их и манипулировать ими, возможно, Core Data подойдет вашим потребностям лучше. – sigsegv

Смежные вопросы