2013-07-24 7 views
1

У меня есть несколько тысяч строк в форме «verb-существительное», для которой я хочу извлечь часть существительного. Я ищу самый быстрый способ сделать это. Глаголы и существительные могут быть любой длины.iOS Самый быстрый способ извлечения подстроки

Я попытался

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

Что это медленно ... Для моего списка более 3000 записей она занимает около 3 секунд.

также попытался

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

, который гораздо быстрее, около половины второго.

У кого-нибудь есть предложения сделать это еще быстрее?

+2

Изменить исходные данные ... – Wain

+2

Откуда берутся ваши строки? В каком формате вы их получите? Вы ** ** используете ** NSString или вообще можете использовать массивы 'char' или' unichar'? –

+0

Скорее всего, самый быстрый, для относительно коротких строк, должен был бы сделать цикл for по строке, используя characterAtIndex для извлечения одного символа за раз и сравнить с «-». Затем подстройте FromIndex после того, как вы найдете эту позицию. –

ответ

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

Просто имейте в виду, что это будет сделать больше, чем один проход одновременно, так что будьте очень уверен резьб вопросы.

Смежные вопросы