2010-07-29 3 views
1

Я хочу сравнить строку с несколькими string.For ехЕсть ли лучший способ сравнения строки с несколькими строками?

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

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

ответ

0

Вы можете создать массив с помощью

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

на самом деле не лучше, но, возможно, более удобным для чтения.

2

Положите ваши строки в 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 (журнал N). Не очень важно для 15 элементов, но, как правило, словарь или набор, скорее всего, будут работать лучше. Что-то, о чем нужно подумать, если вы много делаете для этого поиска/сравнения.

EDIT

Как я уже говорил, NSSet также будет делать Lookups в 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 случаи занять гораздо больше времени, чтобы создать , Но тогда вам нужно сделать это один раз, верно?

+1

Вместо использования словаря с нулевыми значениями, возможно, лучше подходит «NSSet». – Hugh

+0

Кроме того, вы должны использовать 'objectForKey:' вместо 'valueForKey:' с 'NSDictionary'. Для 'NSSet' используйте' containsObject: '. – jtbandes

+0

Вы правы, я печатаю по памяти. –

7

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

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

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

+0

Вот интересное сравнение между NSArray, NSSet и родственными типами: http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html – NullUserException

Смежные вопросы