Как выполнить поиск в массиве строк

#iphone #ios #arrays #uitableview #nsmutablearray

#iPhone #iOS #массивы #uitableview #nsmutablearray

Вопрос:

Я создаю приложение, в котором пользователь может выбирать несколько ячеек из таблицы, и каждый раз, когда выбирается ячейка, она добавляется в NSMutableArray. Таблица содержит названия разных стран. Как только все страны выбраны, как мне выполнить поиск по выбранным странам? Например, как мне проверить, выбрал ли пользователь, например, Соединенные Штаты?

У меня есть это в моем didSelectRow для моей таблицы:

 if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {
        [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
        [listofCountriesselected addObject:[NSNumber numberWithInt:indexPath.row]];

    } 
    else {
        [selectedCell setAccessoryType:UITableViewCellAccessoryNone];
        [listofCountriesselected removeObject:[NSNumber numberWithInt:indexPath.row]];

    }
  

Ответ №1:

Вы можете добавить страны в NSMutableArray и проверить containsObject . В этом случае я добавляю строку — вы можете добавить с помощью некоторого идентификатора страны, но вам нужно проверить по тому же идентификатору страны (независимо от того, что вы выберете). Номер строки не является хорошим идентификатором — он нестабилен.

 NSMutableArray *list = [[NSMutableArray alloc] init];
[list addObject:@"US"];
[list addObject:@"CN"];
NSLog(@"usa? %d", (int)[list containsObject:@"US"]);
  

Еще более быстрый способ проверить, была ли выбрана страна, — добавить страну в NSMutableSet при выборе.

NSMutableSet — это хэш-набор, поэтому поиск выполняется очень быстро.

 NSMutableSet *lookup = [[NSMutableSet alloc] init];
[lookup addObject:@"US"];
[lookup addObject:@"CN"];

NSLog(@"usa? %d", (int)[lookup containsObject:@"US"]);
  

Оба вывода 1.

Ключевое отличие NSMutableArray — это упорядоченный список элементов — список. NSMutableSet оптимизирован для contains — просто набор. Например, если вы хотите отслеживать не только то, что выбрано, но и порядок, в котором они их выбрали, тогда вам нужен изменяемый массив. Приложения также нередко содержат агрегированные структуры данных для ответа на вопросы о порядке и типах.

Кстати, вот как вы можете получить все коды стран ISO

 NSArray *countryCodes = [NSLocale ISOCountryCodes];
for (NSString *cc in countryCodes)
{
    NSLog(@"cc: %@", cc);
}
  

Комментарии:

1. Никогда раньше не думал о компоненте хэша. Люблю учиться! 1