2010-04-05 2 views
0

У меня есть следующая проблема, и я не могу понять, как ее решить. У меня есть NSSet, который содержит объекты Person (NSDictionary с 2 ключами: имя, возраст). Время от времени я получаю объекты NSArray of Person, и я хочу добавить их в свой NSSet, но я хочу отфильтровать дубликаты. Я думаю, что могу использовать NSPredicates, но я читаю документацию, и я не могу понять, как мне отформатировать мой NSPredicate, чтобы отфильтровать содержимое моего массива на основе того, что у меня уже есть в NSSet.NSPredicates с пользовательскими объектами

Итак, у меня есть NSSet с 5 пользовательскими объектами, и я получаю NSArray с 6 объектами, но 3 из них уже существуют в NSSet, и я хочу их отфильтровать. Я понимаю, что я должен делать с основными объектами, такими как строки, целые числа и т. Д., Но я не знаю, как это расширить, чтобы работать с настраиваемыми более сложными объектами.

Надеюсь, я был достаточно ясен с моей проблемой. Любая стартовая точка, пример или совет очень ценятся.

Спасибо!

ответ

0

Если у вас уже есть изменяемый набор, вам действительно не нужно ничего делать. Если вы получите тот же экземпляр Person в какой-то момент в будущем, addObject: просто проигнорирует его. Если у вас есть другое значение «равенства», а не только то, являются ли два объекта одним и тем же экземпляром, тогда вам придется иметь дело с этим самим, но если ваш новый объект возвращает YES для isEqual: then addObject: он тоже будет игнорировать его, когда вы поместите его в набор.

+0

Да, вы правы, это должно произойти, но это не так. Я исследовал проблему немного больше. У меня есть мой NSSet, и пусть 5 целых чисел {0, 1, 2, 3, 4, 5}, если я попытаюсь добавить NSArray размером 5 {1, 0, 3, 2, 5, 4}, он добавит его к NSSet, хотя это одно и то же, но в другом порядке. Я протестировал мой вызов isEqual, и он работает правильно. У вас есть идеи, почему я получаю такое поведение? –

+0

Добавьте каждый элемент в массив. Поскольку NSSet работает с объектами, он просто добавляет ссылку на ваш массив в набор. –

+0

Я нашел настоящую проблему. Я не переопределял хэш-метод, и методы NSSets также используют хэш-код объекта для оценки объектов. Итак, теперь я должен выяснить способ создания равных хеш-кодов для равных объектов. Я отправлю позже решение. –

Смежные вопросы