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

发布于 2024-12-07 02:37:02 字数 734 浏览 3 评论 0原文

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

I have an ordered txt file like this:

aaa
bbb
ccc
ddd
eee

I want to check if "ddd" string exists in the file...

Here my 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;
}

Why does it always returns NO, with any string?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

南汐寒笙箫 2024-12-14 02:37:02

问题在于您读取数组的方式。
如果您替换分配 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,
     ""
 )

The problem is in the way you read in the array.
If you replace the code that assigns LineCount with

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

you will see the binary search performs fine.

There are two issues in your code:

  • Line separator is probably just "\n" if the file has been created on Mac OS X
  • Your array will contain a left over "" as it's last element hence the requirement for ordering as required by CFArrayBSearchValues is no longer satisfied.

As an example:

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

yields (note the last empty element):

 2011-09-29 16:52:33.024 a.out[4019:707] (
     one,
     two,
     ""
 )
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文