在iOS中最有效的方法是检查字符串是否是字符串列表之一?

时间:2011-08-18 00:01:51

标签: iphone objective-c ios cocoa-touch performance

我想看看stringA是否等于任何字符串列表 - string1,string2,string3。什么是最有效的比较方法?

由于我的比较清单相当小,我现在正在尝试这个:

- (BOOL) isStringInList:(NSString *)testString{

if ([testString caseInsensitiveCompare:@"string1"] == NSOrderedSame)
   return YES;
else if ([testString caseInsensitiveCompare:@"string2"] == NSOrderedSame)
   return YES;
else if ([testString caseInsensitiveCompare:@"string3"] == NSOrderedSame)
   return YES;

return NO;
}

如果我有许多要比较的字符串,这显然不能很好地扩展。我更喜欢像-(BOOL) isString:(NSString *)testString inList:(NSString *)listString这样的方法签名,其中listString是一个以空格分隔的关键字字符串。

对于如何改善表现的任何想法都将不胜感激。

4 个答案:

答案 0 :(得分:8)

最高效的方法是构建要比较的NSSet个字符串,然后使用-member:进行测试。一旦构建了该集合,这将是一个恒定时间测试。如果您有一个以空格分隔的列表,则可以使用

NSSet *set = [NSSet setWithArray:[listOfWords componentsSeparatedByString:@" "]]

构造集合将与输入字符串的大小成线性关系。如果您的集合每次都相同,则可以构造一次并保持结果。要进行实际测试,您可以使用

[set member:myWord]

如果结果为零,则您的单词不在集合中。如果它不是零,那就是。请注意,这是一个区分大小写的搜索。如果您需要不区分大小写,那么在执行测试之前,您应该将单词列表和输入单词小写或大写。

答案 1 :(得分:1)

- (BOOL)isString:(NSString*)testString inList:(NSString*)listString
{
    BOOL result = NO;
    if (testString != nil)
    {
        NSRange range = [listString rangeOfString:testString];
        result = (range.location != NSNotFound);
    }
    return result;
}

答案 2 :(得分:0)

- (BOOL)isString:(NSString *)testString inList:(NSString *)spaceSeparatedStrings
{
    NSArray *list = [spaceSeparatedStrings componentsSeparatedByString:@" "];
    return [list containsObject:testString];
}

注意:与您的示例不同,以上内容区分大小写。对于不区分大小写的情况,您可能需要迭代NSArray的某些部分。

答案 3 :(得分:0)

据此,containsObject比我猜想的更有效率。好消息。

二叉搜索树可能会更好,但很明显,这需要一些工作。