【问题标题】:Why binary search not find my string?为什么二进制搜索找不到我的字符串?
【发布时间】:2011-09-29 21:53:44
【问题描述】:

我有一个这样的有序 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,任何字符串?

【问题讨论】:

  • 您的文件太大了,每次需要搜索字符串时都加载它??
  • 你知道bsearch可以返回index &lt; [LinesCount count]但LinesCount不会有那个字符串吗?
  • @Nekto 我不会每次都加载文件......这是一个简单的 sn-p 来显示问题!你有解决办法吗?
  • LinesCount 是否包含任何对象?
  • 您是否验证了数组“LinesCount”实际上有多个条目,并且它至少有一个大于搜索字符串的条目?也可能是编码问题,看看实际数据值。

标签: objective-c algorithm binary-search


【解决方案1】:

问题在于您在数组中的读取方式。 如果将分配LineCount 的代码替换为

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

你会看到二分搜索执行得很好。

您的代码中有两个问题:

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

举个例子:

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

yields(注意最后一个空元素):

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

【讨论】:

  • 太棒了!这就是问题!我文件中的最后一个字符串是“”!非常感谢!!
猜你喜欢
  • 2023-03-24
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2023-02-05
相关资源
最近更新 更多