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

mem*_*ons 2 iphone performance cocoa-touch objective-c ios

我想看看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;
}
Run Code Online (Sandbox Code Playgroud)

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

任何关于如何提高性能的想法都将受到赞赏.

Lil*_*ard 8

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

NSSet *set = [NSSet setWithArray:[listOfWords componentsSeparatedByString:@" "]]
Run Code Online (Sandbox Code Playgroud)

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

[set member:myWord]
Run Code Online (Sandbox Code Playgroud)

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

  • 我测试了它的性能,并没有像调用`-containsObject:`那样高效.我怀疑`+ setWithArray:`引入了一些开销,而`-containsObject:`也是常量时间. (3认同)