有没有更好的方法来比较字符串与多个字符串?

时间:2010-07-29 00:30:23

标签: iphone string logic compare

我想比较一个字符串和多个字符串。对于前

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

在我的情况下,我必须与15个字符串进行比较,所以我必须检查15次。是否还有其他更好的方法来比较它。是否有任何小的简单代码将实现我的逻辑。

3 个答案:

答案 0 :(得分:7)

最好将字符串添加到NSSet中,如下所示:

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

许多其他解决方案使用数组或字典用于相同目的。集合是正确的数据结构,因为它们是为了包含无序对象和测试成员资格而创建的。与containsObject:中需要进行元素搜索的相同方法相比,我非常确定NSArray在恒定时间内运行。

答案 1 :(得分: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个实例需要更长时间才能创建。但是你只需要做一次,对吧?

答案 2 :(得分:0)

您可以使用

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

不是更好,但可能更具可读性。