Почему бинарный поиск не находит мою строку? - PullRequest
1 голос
/ 29 сентября 2011

У меня есть заказанный текстовый файл, подобный этому:

aaa
bbb
ccc
ddd
eee

Я хочу проверить, существует ли в файле строка "ddd" ...

Вот мой функционал:

- (BOOL) asd:(NSString*)sting 
{
NSArray *LinesCount = 
  [[NSString stringWithContentsOfFile:@"longfile.txt"  
   encoding:NSStringEncodingConversionAllowLossy error:nil]   
    componentsSeparatedByString:@"\r\n"];

unsigned index = (unsigned)CFArrayBSearchValues(
                 (CFArrayRef)LinesCount, 
                 CFRangeMake(0, CFArrayGetCount((CFArrayRef)LinesCount)),
                 (CFStringRef)string, 
                 (CFComparatorFunction)CFStringCompare, 
                 NULL);
if (index < [LinesCount count]) return YES;
return NO;
}

Почему он всегда возвращает NO с какой-либо строкой?

1 Ответ

3 голосов
/ 29 сентября 2011

Проблема в том, как вы читаете в массиве.Если вы замените код, который присваивает LineCount на

NSArray * LinesCount = [NSArray arrayWithObjects:@"aaa", @"bbb", @"ccc", @"ddd", @"eee", nil];

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

В вашем коде есть две проблемы:

  • Разделитель строк, вероятно, просто "\ n", если файл был создан в Mac OS X
  • Ваш массив будет содержать оставшийся "" как последний элемент, поэтому требование к упорядочению в соответствии с CFArrayBSearchValuesбольше не удовлетворен.

Например:

 NSLog(@"%@", [@"one\ntwo\n" componentsSeparatedByString:@"\n"]);

выход (обратите внимание на последний пустой элемент):

 2011-09-29 16:52:33.024 a.out[4019:707] (
     one,
     two,
     ""
 )
...