Почему NSOrderedMutableSet добавляет объекты, данные которых совпадают?

Я создаю объекты и добавляю их в набор, используя -[NSOrderedMutableSet addObject:], но я обнаружил, что проверяются только дубликаты самих объектов - предположительно, адрес указателя объекта, и что возможно добавить несколько объектов с одинаковым содержимым.

Например:

SomeObject* object = [SomeObject alloc] initWithStuff:stuff];
SomeObject* object2 = [SomeObject alloc] initWithStuff:stuff];

[set addObject:object];
[set addObject:object];
[set addObject:object1];
[set addObject:object2];

Количество будет 2.

Это заставляет меня задуматься, в чем смысл этих занятий? При каких обстоятельствах можно иметь объект и не знать, был ли сам объект уже добавлен в коллекцию, а не данные, содержащиеся в объекте?

Какой самый простой способ (или какой класс я должен использовать) использовать, чтобы убедиться, что набор содержит только один из каждого объекта на основе содержимого?

2 ответа

Решение

То, как вы смотрите, это правильный путь, вы забыли небольшую деталь: как мог NSMutableOrderedSet класс знает о каких случаях SomeObject содержат одинаковые значения?

Ответ прост: вы должны предоставить свои собственные реализации

- (BOOL)isEqual:(id)anObject
- (NSUInteger)hash

Так что ваши экземпляры будут возвращать true при сравнении с одинаковыми внутренними значениями, и два экземпляра с одинаковыми данными будут иметь одинаковый хэш-код.

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

Если у вас есть пользовательский объект, вам нужно будет реализовать свой собственный метод isEqual: и хеш, чтобы проверить на равенство и предотвратить дублирование в наборе.

Другие вопросы по тегам