2011-09-29 41 views
1

我有一個有序的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 <[LinesCount count]',但'LinesCount'不會有那個字符串嗎? – Nekto

+0

@Nekto我不會每次加載文件...這是一個簡單的代碼片段來顯示問題!你有想法解決它嗎? – elp

回答

3

問題出在你讀數組的方式。 如果用

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