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

Posted

技术标签:

【中文标题】有没有更好的方法来比较一个字符串和多个字符串?【英文标题】:Is there any better way for comparing a string with multiple strings? 【发布时间】:2011-03-22 11:29:45 【问题描述】:

我想比较一个字符串和多个字符串。例如

if([var isEqualToString:@"Box"]||[var isEqualToString:@"Ball"]|[varisEqualToString:@"Bat"])

some function
else
some function

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这里是 NSArray、NSSet 和相关类型之间的有趣比较:cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html【参考方案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 实例的创建时间要长得多。但是你只需要做一次,对吧?

【讨论】:

与其使用具有空值的字典,也许NSSet 更适合。 另外,您应该使用objectForKey: 而不是valueForKey:NSDictionary。对于NSSet,请使用containsObject:【参考方案3】:

您可以使用

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

   ...

else

   ...

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

【讨论】:

以上是关于有没有更好的方法来比较一个字符串和多个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

有没有比字符串操作更好的选择来以编程方式构建公式?

比较想法相似性的算法(作为字符串)

【php】同一字符串,多个条件,如何高效的匹配?

有没有更好的方法来排列字符串?

有没有更好的方法来使用没有 eval 的字符串来获取对动作脚本中影片剪辑的引用

检测字符串是不是包含多个单词的更好方法