2010-07-29 99 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(log n)的。對於15個元素來說並不重要,但作爲一般規則,字典或集合可能表現更好。有些事情要考慮,如果你做這個搜索/比較了很多。

編輯

正如我提到的,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情況下,需要更長的時間來創造。但是你只需要做一次,對吧?

+1

而不是使用空值的字典,可能'NSSet'會更適合。 – Hugh 2010-07-29 01:02:38

+0

另外,你應該使用'objectForKey:'而不是'valueForKey:'和'NSDictionary'。對於'NSSet',使用'containsObject:'。 – jtbandes 2010-07-29 01:11:33

+0

你說得對,我從記憶中打字。 – 2010-07-29 01:12:49

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 2010-07-29 01:25:18