【问题标题】: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 次。有没有其他更好的方法来比较它。是否有任何小的简单代码可以实现我的逻辑。

【问题讨论】:

    标签: iphone string logic compare


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案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
    {
       ...
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      相关资源
      最近更新 更多