Подтвердить что ты не робот

Поиск NSArray для значения соответствия значений

У меня есть NSArray objects, который имеет определенное свойство, называемое name (тип NSString).
У меня есть второй NSArray из NSStrings, которые names.

Я хотел бы получить NSArray всего objects, свойство .name соответствует одному из names во втором NSArray.

Как мне это сделать, быстро и эффективно, так как это потребуется довольно часто.

4b9b3361

Ответ 1

С вашими текущими структурами данных вы можете делать это только в 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];
        }
    }
}

(Альтернативный вариант, предложенный Stefan: цикл над массивом объектов и запрос массива имен, если он containsObject: для имени каждого объекта.)

Но если это действительно должно быть быстрее (действительно зависит от размера массивов и насколько часто вы это делаете), вы можете улучшить это, введя NSDictionary, который отображает names в первом массиве на их объекты. Тогда каждый из этих поисков - O (1), а общее время O (n). (Вам нужно будет поддерживать этот словарь всегда в синхронизации с массивом объектов, что не сложно с разумными аксессуарами. Этот метод также имеет ограничение на то, что тот же name не может отображаться более чем на одном объекте.)

Альтернативный способ получить этот результат (и который не имеет этого последнего ограничения) - использовать NSSet для вашей второй коллекции, а затем пройти через массив объектов, вызывающий containsObject:, с каждым из множества имен. Является ли этот метод лучше, зависит от того, имеют ли ваши две коллекции примерно одинаковый размер, или если он намного больше, чем другой.

Ответ 2

Почему бы просто не использовать предикаты для этого?

// For number kind of values:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF = %@", value];
NSArray *results = [array_to_search filteredArrayUsingPredicate:predicate];

// For string kind of values:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", value];
NSArray *results = [array_to_search filteredArrayUsingPredicate:predicate];

// For any object kind of value (yes, you can search objects also):
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", value];
NSArray *results = [array_to_search filteredArrayUsingPredicate:predicate];

Ответ 3

Вот простой способ:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", nameToFind];
[listOfItems filteredArrayUsingPredicate:predicate];

Ответ 4

Мне нравится использовать этот метод:

NSIndexSet *indexes = [_items indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
   return ((MyObject *)obj).name isEqualToString:name];
}];

if (indexes.count != 0) {
//extract your objects from the indexSet, and do what you like...
}

Ответ 5

NSMutableArray * foundNames = [NSMutableArray array];
for (MyObject * objectWithName in objectCollection) {
    if ([names containsObject:objectWithName.name]) {
        [foundNames objectWithName];
    }
}

Ответ 7

NSMutableArray* solutions = [NSMutableArray array];

for (Object* object in objects){
   for (NSString* name in names){
       if ([object.name isEqualToString:name]){
          [solutions addObject:object];
          break; // If this doesnt work remove this
       }
   }
}

Ответ 8

int count=0;

if (range.location!=NSNotFound)
  {                   
  [searchindex addObject:[NSString stringWithFormat:@"%d",count]];           
  }