создайте массив, удалив повторяющиеся имена и в алфавитном порядке

#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. Не уверен, о чем вы спрашиваете. Это сортирует весь массив, используя данный блок для сравнения элементов в массиве.