2010-07-29 102 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