2013-10-09 2 views
0

У меня есть довольно большое количество NSManagedObjects в NSArray и нужно проверить, имеют ли какое-либо из них одинаковое значение для свойства. Очевидный способ вложен в петли, однако для их прохождения потребуется много времени, так как в массиве около 1000 объектов.Найти NSManagedObjects из NSArray, у которых есть свойство

for (NSManagedObject *object in array) { 
    for (NSManagedObject *secondObject in array { 
     if ([[object valueForKey:@"key"] isEqualTo:[secondObject valueForKey:@"key"]] && 
      object != secondObject) { 
      NSLog(@"Sharing a property"); 
     } 
    } 
} 

Любой лучший способ сделать это? Если есть 1000 объектов, которые учитывают 1 000 000 сравнений, это может занять некоторое время.

+0

Вам нужно только проверить, произошло ли дублирующее значение, или вам также нужно знать, какие объекты * делят значение? –

+0

Также какие объекты делят значение –

ответ

2

Вы может сортировать массив в соответствии со значениями этого свойства. Затем один цикл над массивом достаточно, чтобы найти объекты, имеющие одно и то же значение свойства.

+0

Просто, чтобы уточнить, что будет сортировать по @ "key", а затем проверить, совпадают ли два в строке с петлей for? –

+0

@DenisBalko: Да, это именно то, что я имел в виду. –

+0

Весь великий ответ, но этот, кажется, самый простой, поэтому, вероятно, пойдет с ним. –

3

Получите the list of key values для объектов в массиве, затем превратите их в set. Если размер набора такой же, как у исходного массива, совпадений нет.

Если вам нужно знать , который соответствует объекту, используйте словарь для создания мультимножества - каждый ключ имеет массив объектов в качестве значения.

Creating your own keyed set class также вариант.

+0

awesome. не подумал об этом - cool –

4

Вы можете использовать NSDictionary. Каждая запись будет сделана из следующей пары:

  • key будет равен выбранному NSManagedObject сек атрибута
  • value бы NSArray из NSManagedObject с, что доля значение этого атрибута
Смежные вопросы