1

我有几千个“动词名词”形式的字符串,我想为其提取名词部分。我正在寻找最快的方法来做到这一点。动词和名词部分可以是任意长度。

我努力了

NSString *noun = [[verb componentsSeparatedByString:@"-"] lastObject];

这很慢......对于我的超过 3000 个条目的列表,大约需要 3 秒。

也试过

NSString *noun = [verb substringFromIndex:[verb rangeOfString:@"-"].location + 1];

这要快得多,大约半秒。

任何人有建议让这更快?

4

2 回答 2

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...
});

请记住,这同时执行不止一次,因此要非常确定线程问题。

于 2013-07-25T00:31:08.323 回答
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");
}
于 2013-07-24T23:11:14.070 回答