为什么二分查找找不到我的字符串?
问题描述:
我有一个有序的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,以及任何字符串?
答
问题出在你读数组的方式。 如果用
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
您的文件tooooo大,但是当你需要搜索字符串,每次加载它? ? – Nekto
你知道bsearch可以返回'index Nekto
@Nekto我不会每次加载文件...这是一个简单的代码片段来显示问题!你有想法解决它吗? – elp