Множество NSArray и общих объектов

#objective-c #nsarray

#objective-c #nsarray

Вопрос:

Итак, у меня есть несколько NSArrays (на самом деле 5), и я хотел бы создать новый NSArray, содержащий только объекты, общие для ВСЕХ массивов. Есть ли эффективный способ сделать это. Единственный способ, который я могу придумать, это перебирать все массивы, сравнивая каждый объект.

Комментарии:

1. Я думаю, вы должны просмотреть их в цикле…

2. Вы упомянули о поиске более простого решения в комментариях к предыдущему вопросу. Не могли бы вы поподробнее?

3. @ChrisHaze ах, извините, я отредактировал свой первоначальный вопрос своим решением. Я добавлю это как новый ответ и приму его как правильный. 🙂

Ответ №1:

В итоге я использовал это, которое работает довольно хорошо:

 NSMutableSet *set = [NSMutableSet setWithArray:array];
NSMutableSet *set1 = [NSMutableSet setWithArray:array2];
NSMutableSet *set2 = [NSMutableSet setWithArray:array3];
NSMutableSet *set3 = [NSMutableSet setWithArray:array4];
NSMutableSet *set4 = [NSMutableSet setWithArray:array5];

[set intersectSet:set1];
[set intersectSet:set2];
[set intersectSet:set3];
[set intersectSet:set4];

NSArray *allArray = [set allObjects];
  

Комментарии:

1. Моей целью было подсчитать общее количество совпадающих экземпляров и подготовить аналогичный сценарий, но не совсем. Спасибо за публикацию: я решил использовать подход NSCountedSet, предварительно загрузив в него все содержимое NSArrays, и, похоже, это работает. Однако я не уверен в масштабируемости. Еще раз спасибо @gypsyDev

Ответ №2:

Почему бы не создать NSSet (NSMutableSet, на самом деле), сбросить в него содержимое всех 5 массивов, а затем создать новый NSArray из NSSet?

Извините, я изначально неправильно истолковал ваш вопрос. Да, я думаю, вам в значительной степени придется перебирать каждый из них, чтобы найти дубликаты. Но это не так страшно реализовать (однако может быть несколько медленным во время выполнения, если ваши массивы огромны).

Вот несколько примеров кода:

 - (void) filterSet: (NSMutableSet*)set withArray: (NSArray*) array {
    NSMutableSet* removals = [NSMutableSet setWithCapacity:[array count]];
    for (id obj in set) {
        if (! [array containsObject: obj]) {
            [removals addObject: obj];
        }
    }
    [set minusSet: removals];
}

NSMutableSet* mySet = [NSMutableSet setWithCapacity:[array1 count] * 5];
[mySet addObjectsFromArray: array1];
[self filterSet: mySet withArray: array2];
[self filterSet: mySet withArray: array3];
[self filterSet: mySet withArray: array4];
[self filterSet: mySet withArray: array5];

NSArray* filteredArray = [mySet allObjects];
  

Комментарии:

1. это создаст массив, содержащий все объекты, хотя мне просто нужны дубликаты. Я думаю, что NSSet — это то, что я ищу, хотя я нашел этот метод: intersectSet:

2. @gypsyDev — Ах, извините, вы хотите все дубликаты. Это делает обратное. Я неправильно прочитал и подумал, что вы хотите все уникальные.

3. @gypsyDev — Хорошо, я исправил это, чтобы найти / сохранить дубликаты.

4. я нашел еще более простое решение, добавленное к моему вопросу: