为什么二分查找找不到我的字符串?

问题描述:

我有一个有序的txt文件是这样的:为什么二分查找找不到我的字符串?

aaa 
bbb 
ccc 
ddd 
eee 

我要检查,如果 “DDD” 字符串的文件中存在...

这里我FUNC:

- (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,以及任何字符串?

+2

您的文件tooooo大,但是当你需要搜索字符串,每次加载它? ? – Nekto

+0

你知道bsearch可以返回'index Nekto

+0

@Nekto我不会每次加载文件...这是一个简单的代码片段来显示问题!你有想法解决它吗? – elp

问题出在你读数组的方式。 如果用

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

替换分​​配LineCount的代码,你会看到二进制搜索执行罚款。

有在你的代码的两个问题:

  • 行分隔符可能只是“\ n”如果文件已经在Mac OS X创建
  • 你的数组将包含一个遗留下来的“”为它是最后一个元素,因此不再满足CFArrayBSearchValues要求的排序要求。

举个例子:

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

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

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

太棒了!这就是问题!我的文件中的最后一个字符串是“”!非常感谢!! – elp