2013-07-24 43 views
1

我有幾千個字符串形式「動詞 - 名詞」,我想提取名詞部分。我正在尋找最快的方式來做到這一點。動詞和名詞部分可以是任意長度。iOS最快的方法來提取子字符串

我已經試過

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

這是慢......對於我它需要大約3秒超過3000項的列表。

還試圖

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

這是快得多,大約半秒。

任何人都有建議讓這更快?

+2

更改源數據... – Wain

+2

你的字符串從哪裏來?你以什麼格式獲得他們?你有**是否可以使用'NSString',或者你可以直接使用'char'或'unichar'數組嗎? –

+0

對於相對較短的字符串,最可能最快的方法是對字符串執行for循環,使用characterAtIndex一次獲取一個字符並將其與「 - 」進行比較。然後在你找到那個位置之後使用substringFromIndex。 –

回答

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

只要記住這同時做一個以上的傳球,所以很肯定線程問題。

相關問題