Проверять дубликаты объектов в NSMutableArray? - PullRequest
3 голосов
/ 29 марта 2010

Я добавляю объекты (в данном случае NSNumbers) в NSMutableArray, и я хотел проверить, как лучше всего проверять наличие дубликатов в массиве перед добавлением. (То есть.)

Number to add
if (NSMutableArray does not contain Number) {
    add Number
}

EDIT:

Большое спасибо, сегодня утром мне повезло в NSArray, но я полностью пропустил "containsObject". Это было бы просто замечательно, но, посмотрев на NSMutableSet, это гораздо больше, чем я искал. Последний вопрос, если можно:

while([mySet count] < 5) {
    NSNumber *numberToAdd = [NSNumber numberWithInt:random() %10];
    [mySet addObject:numberToAdd];
}

Я не думаю, что это на самом деле имеет значение, но лучше проверить, содержит ли набор "содержит объект" или просто выбросить дубликат и продолжить.

while([mySet count] < 5) {
    NSNumber *numberToAdd = [NSNumber numberWithInt:random() %10];
    if(!mySet containsObject:numberToAdd) [mySet addObject:numberToAdd];
}

Опять же высоко ценится, это действительно круто и сэкономит мне кучу времени.

* 1016 Гэри *

Ответы [ 5 ]

15 голосов
/ 29 марта 2010

Помните, что NSMutableArray - это тоже NSArray.

if (![theArray containsObject:theNumber]) {
  // does not contain.
}

(Если вам нужны уникальные объекты и вам не нужен порядок вставки, NSMutableSet - более эффективный контейнер.)

5 голосов
/ 29 марта 2010

Чтобы ответить на ваш второй вопрос: нет, вам не нужно проверять, содержит ли набор объект уже. NSMutableSet сделает это за вас, когда вы позвоните addObject:. У него может быть более эффективный способ сделать это (так как он имеет доступ к внутренней структуре данных), так что вы можете фактически получить небольшое повышение производительности, позволив NSMutableSet обработать его.

Если ничего другого, вам нужно написать меньше кода, и это всегда приятно.

1 голос
/ 24 января 2013

У меня есть категория на NSMutableArray

@interface NSMutableArray (CategoryName)

- (void)addObjectUnique:(id)anObject;

@end

@implementation NSMutableArray (CategoryName)

- (void)addObjectUnique:(id)anObject
{
  if ([self containsObject:anObject]) {
    return;
  }
  [self addObject:anObject];
}

@end
1 голос
/ 29 марта 2010

Это зависит от размера вашего массива. Вы можете проверить, есть ли что-то в массиве, используя -containsObject:. Это может быть так же плохо, как O(n*logn) для длины массива и, следовательно, не очень хорошо для супер больших массивов, но делает код простым в обслуживании.

Общий способ сделать это, хотя в общем случае для наборов данных произвольного размера, - хранить NSMutableSet рядом с массивом. Проверьте набор на наличие элемента перед добавлением в массив. Если он уже есть в наборе, не добавляйте его. Если нет, добавьте его к обоим.

Конечно, если вы не заботитесь о порядке и только уникальности, тогда вообще не используйте массив, просто используйте Set.

0 голосов
/ 29 марта 2010

Попробуйте это:

// Number to add is newNumber, myArray is your Mutable array
if(![myArray containsObject:newNumber])
{
  [myArray addObject:myNumber];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...