我想看看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
是一个以空格分隔的关键字字符串。
对于如何改善表现的任何想法都将不胜感激。
答案 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比我猜想的更有效率。好消息。
二叉搜索树可能会更好,但很明显,这需要一些工作。