为什么二元搜索找不到我的字符串?

时间:2011-09-29 13:24:59

标签: objective-c algorithm binary-search

我有一个这样的有序txt文件:

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 个答案:

答案 0 :(得分:3)

问题在于您在数组中读取的方式。 如果您替换了使用

分配LineCount的代码
NSArray * LinesCount = [NSArray arrayWithObjects:@"aaa", @"bbb", @"ccc", @"ddd", @"eee", nil];

你会看到二进制搜索表现不错。

您的代码中存在两个问题:

  • 如果文件是在Mac OS X上创建的,则行分隔符可能只是“\ n”
  • 您的数组将包含一个剩余的“”,因为它是最后一个元素,因此不再满足CFArrayBSearchValues所要求的排序要求。

举个例子:

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

收益率(注意最后一个空元素):

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