Есть ли лучший способ для сравнения строки с несколькими строками? - PullRequest
1 голос
/ 29 июля 2010

Я хочу сравнить строку с несколькими строками. Например,

if([var isEqualToString:@"Box"]||[var isEqualToString:@"Ball"]|[varisEqualToString:@"Bat"])
{
some function
}else{
some function
}

В моем случае мне нужно сравнить с 15 строками, поэтому я должен проверить 15 раз. Есть ли другой способ получше?сравнить это.Есть ли какой-нибудь небольшой простой код, реализующий мою логику.

Ответы [ 3 ]

7 голосов
/ 29 июля 2010

Вам лучше добавить строки в NSSet следующим образом:

NSSet *mySet = [NSSet setWithObjects:@"Box", @"Ball", @"Bat", nil];
if([mySet containsObject:string]) {
} else {
}

Многие другие решения используют массивы или словари для той же цели.Наборы являются правильной структурой данных для этого, так как они созданы с целью содержания неупорядоченных объектов и проверки членства.Я почти уверен, что containsObject: работает в постоянном времени по сравнению с тем же методом в NSArray, который должен выполнять поиск элементов.

2 голосов
/ 29 июля 2010

Положите свои строки в NSDictionary:

NSNull *nullValue = [NSNull null];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:nullValue, nullValue, ..., nil forKeys:@"Box", @"Ball", ..., nil];
if ([dictionary objectForKey:var]) {
    // var matches one of the keys, run function 
}
else { 
    // var doesn't match any of the keys, do something else
}

Поиск по словарю - O (1), тогда как поиск по массиву, вероятно, O (log n). Ничего страшного для 15 элементов, но, как правило, словарь или набор, скорее всего, будут работать лучше. Есть о чем подумать, если вы будете много заниматься поиском / сравнением.

EDIT

Как я уже говорил, NSSet также выполнит поиск за O (1) время:

NSSet *comparisonSet = [NSSet setWithObjects:@"Box", @"Ball", ..., nil];
if ([comparisonSet containsObject:var]) {
    // var matches set object, run function
} 
else {
    // var doesn't match any of the set objects, do something else
}

Более чистый код, безусловно, но я думаю, что NSSet экземпляры создаются намного дольше. Но тогда вам нужно сделать это только один раз, верно?

0 голосов
/ 29 июля 2010

Вы можете создать массив, используя

NSArray *stringArray = [NSArray arrayWithObjects: @"Box", @"Ball", @"Bat", nil];
if([NSArray indexOfObject:var] != NSNotFound)
{
   ...
}
else
{
   ...
}

Не совсем лучше, но, возможно, более читабельно.

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