我想比较一个字符串和多个字符串。对于前
if([var isEqualToString:@"Box"]||[var isEqualToString:@"Ball"]|[varisEqualToString:@"Bat"])
{
some function
}else{
some function
}
在我的情况下,我必须与15个字符串进行比较,所以我必须检查15次。是否还有其他更好的方法来比较它。是否有任何小的简单代码将实现我的逻辑。
答案 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
{
...
}
不是更好,但可能更具可读性。