Какой самый эффективный способ в iOS проверить, является ли строка одной из списка строк? - PullRequest
2 голосов
/ 18 августа 2011

Я хочу посмотреть, равна ли строка A какому-либо из списка строк - строка1, строка2, строка3. Какой самый эффективный способ сделать сравнение?

Поскольку мой список сравнений довольно мал, я сейчас пытаюсь это сделать:

- (BOOL) isStringInList:(NSString *)testString{

if ([testString caseInsensitiveCompare:@"string1"] == NSOrderedSame)
   return YES;
else if ([testString caseInsensitiveCompare:@"string2"] == NSOrderedSame)
   return YES;
else if ([testString caseInsensitiveCompare:@"string3"] == NSOrderedSame)
   return YES;

return NO;
}

Это, очевидно, плохо масштабируется, если у меня есть много строк для сравнения. Я бы предпочел больше сигнатур метода, таких как -(BOOL) isString:(NSString *)testString inList:(NSString *)listString, где listString - строка ключевых слов, разделенных пробелами.

Буду признателен за любые мысли о том, как улучшить производительность.

Ответы [ 4 ]

8 голосов
/ 18 августа 2011

Наиболее эффективный способ - создать NSSet из строк, с которыми вы хотите сравнить, и использовать -member: для тестирования.Как только набор будет создан, это будет тест с постоянным временем.Если у вас есть список разделенных пробелами для начала, вы можете использовать

NSSet *set = [NSSet setWithArray:[listOfWords componentsSeparatedByString:@" "]]

Построение набора будет линейным по размеру входной строки.Если ваш набор каждый раз один и тот же, вы можете создать его один раз и сохранить результат.Чтобы выполнить настоящий тест, вы можете использовать

[set member:myWord]

Если результат равен нулю, вашего слова нет в наборе.Если это не ноль, это так.Обратите внимание, это поиск с учетом регистра.Если вам нужна нечувствительность к регистру, то перед выполнением теста вы должны либо прописать, либо прописать как список слов, так и входное слово.

1 голос
/ 18 августа 2011
- (BOOL)isString:(NSString*)testString inList:(NSString*)listString
{
    BOOL result = NO;
    if (testString != nil)
    {
        NSRange range = [listString rangeOfString:testString];
        result = (range.location != NSNotFound);
    }
    return result;
}
0 голосов
/ 18 марта 2014

Согласно этому, selectedObject более эффективен, чем я мог бы предположить. Хорошие новости.

Бинарное дерево поиска может быть лучше, но, очевидно, это потребует некоторой работы.

0 голосов
/ 18 августа 2011
- (BOOL)isString:(NSString *)testString inList:(NSString *)spaceSeparatedStrings
{
    NSArray *list = [spaceSeparatedStrings componentsSeparatedByString:@" "];
    return [list containsObject:testString];
}

Примечание: все вышеперечисленное будет чувствительным к регистру, в отличие от вашего примера. Для нечувствительного к регистру вам, вероятно, придется перебирать некоторую часть NSArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...