我有“动词名词”形式的数千个字符串,我想要提取名词部分。我正在寻找最快的方法来做到这一点。动词和名词部分可以是任何长度。
我试过了
NSString *noun = [[verb componentsSeparatedByString:@"-"] lastObject];
这很慢......对于我的超过3000个条目的列表,大约需要3秒钟。
也试过
NSString *noun = [verb substringFromIndex:[verb rangeOfString:@"-"].location + 1];
更快,大约半秒。
有人建议让这个更快吗?
答案 0 :(得分:1)
如果您使用这些字符串的工作是线程安全的,那么一个选项是使用GCD同时迭代多个verb
值,从而使多个内核付诸实施。使用dispatch_apply
代替您正在使用的任何循环,例如:
dispatch_apply([myWordArray count], queue, ^(size_t i) {
NSString *verb = [myWordArray objectAtIndex:i];
NSString *noun = [verb substringFromIndex:[verb rangeOfString:@"-"].location + 1];
// do something with noun...
});
请记住,此将同时执行多次传递,因此请确保线程问题。
答案 1 :(得分:0)
最快的方法可能是对连字符所在的最可能的情况进行排序,然后在不使用循环的情况下首先检查这些情况。例如,如果连字符索引的最可能情况是按顺序分别为5,4,6,7,3,2,则可以这样做:
NSString * verb = @"verb-noun";
NSString * noun = nil;
//use do...while(0) to avoid nested if else
do
{
if([verb characterAtIndex:5] == '-')
{
noun = [verb substringFromIndex:6];
break;
}
if([verb characterAtIndex:4] == '-')
{
noun = [verb substringFromIndex:5];
break;
}
if([verb characterAtIndex:6] == '-')
{
noun = [verb substringFromIndex:7];
break;
}
if([verb characterAtIndex:7] == '-')
{
noun = [verb substringFromIndex:8];
break;
}
if([verb characterAtIndex:3] == '-')
{
noun = [verb substringFromIndex:4];
break;
}
if([verb characterAtIndex:2] == '-')
{
noun = [verb substringFromIndex:4];
break;
}
} while(0);
//if not one of most likely cases, loop
if(!noun)
{
for(int j = 8; j < verb.length; j++)
{
if([verb characterAtIndex:j] == '-')
{
noun = [verb substringFromIndex:j + 1];
break;
}
}
}
if(noun)
{
//noun should never be nil
NSLog(@"found the noun");
}