#iphone #objective-c #xcode
#iPhone #objective-c #xcode
Вопрос:
У меня есть NSMutableArray, содержащий словари записей. Каждая запись имеет несколько ключей, один из которых — «Title», который содержит строку имени.
В модели данных много дубликатов, потому что некоторые записи относятся к разным разделам. Например, «Грипп» может быть найден в разделе «Лихорадка» или «Боли и боли». Итак, теперь у меня есть пара ключ-значение с двумя записями под названием «Грипп» в качестве заголовка.
При реализации поиска в TableViewController, если я набираю «Influence», я получаю дубликаты. Чтобы удалить их, я попробовал следующее:
self.searchEntries = [[NSSet setWithArray:entries]allObjects];
[searchEntries sortedArrayUsingSelector:@selector(compareName:)];
Однако, похоже, это не дает ничего полезного. Я все еще получаю дубликаты, и список не в алфавитном порядке.
Может ли кто-нибудь помочь мне с этим, казалось бы, простым делом?
Ответ №1:
я надеюсь, что этот код поможет вам
NSSet *uniqueElements = [NSSet setWithArray:myArray];
// iterate over the unique items
for(id element in uniqueElements) {
// do something
}
удачи
Ответ №2:
Действительно ли ваши дубликаты дублируют друг друга? Или есть какие-либо специальные символы / заглавные буквы?
Для сортировки вам нужно будет сделать
searchEntries = [searchEntries sortedArrayUsingSelector:@selector(compareName:)];
as - sortedArrayusingSelector:
вернет NSArray.
Обновление: поскольку entries
содержит элементы типа NSDictionary
, вы можете получить уникальный и отсортированный массив следующим образом:
searchEntries = [entries valueForKeyPath:@"@distinctUnionOfObjects.title"];
searchEntries = [searchEntries sortedArrayUsingSelector:@selector(compare:)];
Обратите внимание, что searchEntries
теперь он содержит только значения заголовка (что может быть нормально, если вы просто хотите отобразить их в виде таблицы).
Комментарии:
1. Спасибо, тило. Метод сортировки работает великолепно. Что касается дубликатов, я просто хочу сравнить строки, например «Грипп».
2. Ваш
entries
содержит «Грипп», … «Грипп», ..? Если это так, ваш NSSet должен содержать только один «Грипп». Можете ли вы опубликовать пример?3. Это странная вещь… по какой-то причине NSSet возвращается с несколькими «инфлюэнцами». Вероятно, я делаю что-то не так в другом месте, но, похоже, не могу найти ошибку.
4. Что
entries
содержит? Элементы классаNSString
,NSDictionary
, пользовательские объекты?5.
entries
это NSMutableArray, который содержит словари с шестью разнымиNSString
и однимint
. Имя каждой записи находится под ключом «Title» со значением, которое является именем, которое в данном случае является «Influence». Итак, я надеюсь получитьNSMutableArray
со словарями, где «Заголовок» не дублируется. Надеюсь, это понятно…
Ответ №3:
Прежде всего, все объекты в вашем массиве должны реагировать на выбранный вами селектор. NSDictionary не отвечает на compareName: насколько мне известно.
Во-вторых, методы sortedArray … создают совершенно новый массив. В NSMutableArray есть несколько методов сортировки.
Вероятно, проще всего использовать, если у вас есть изменяемый массив -sortUsingComparator:
, например
[[self searchEntries] sortUsingComparator: ^(id obj1, id obj2)
{
return [[obj1 title] compare: [obj2 title]];
}];
Если у вас есть неизменяемый массив
sortedArray = [[self searchEntries] sortedArrayUsingComparator: ^(id obj1, id obj2)
{
return [[obj1 title] compare: [obj2 title]];
}];
Комментарии:
1. Спасибо JeremyP, но как мне сделать это для более чем 300 записей?
2. Не уверен, о чем вы спрашиваете. Это сортирует весь массив, используя данный блок для сравнения элементов в массиве.