iOS最快的方法来提取子字符串

时间:2013-07-24 22:39:35

标签: ios objective-c nsstring

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

我试过了

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

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

也试过

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

更快,大约半秒。

有人建议让这个更快吗?

2 个答案:

答案 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");
}