С вашими текущими структурами данных вы можете сделать это только за O (n ^ 2), циклически перебирая первый массив один раз для каждого члена второго массива:
NSMutableArray * array = [NSMutableArray array];
for (NSString * name in names) {
for (MyObject * object in objects) {
if ([[myObject name] isEqualToString:name]) {
[array addObject:object];
}
}
}
(альтернативно, как предложено)Стефан: зациклите массив объектов и спросите массив имен, если он containsObject:
для имени каждого объекта.)
Но если это действительно должно быть быстрее (действительно зависит от размера массивов каккак бы часто вы это не делали), вы можете улучшить это, введя NSDictionary, который отображает names
в первом массиве на их объекты.Тогда каждый из этих поисков равен O (1), а общее время равно O (n).(Вы должны держать этот словарь всегда синхронизированным с массивом объектов, что не сложно с разумными средствами доступа. Этот метод также имеет ограничение, что один и тот же name
не может появляться более чем на одном объекте.)
Альтернативный способ получения этого результата (и который не имеет этого последнего ограничения) состоит в том, чтобы использовать NSSet для вашей второй коллекции, а затем пройтись по массиву объектов, вызывая containsObject:
с каждым на множествеимен.Насколько этот метод лучше, зависит от того, имеют ли ваши две коллекции примерно одинаковый размер, или одна из них намного больше другой.