iOS 二分搜索代码在超过 256 项时崩溃

标签 ios arrays objective-c search binary-search

我使用 iOS 默认代码在数组中存在的自定义字典对象中搜索字符串,意思是字典项数组。

NSRange searchRange = NSMakeRange(0, artistThumbnail.count);
index = [artistThumbnail indexOfObject:artist
                         inSortedRange:searchRange
                               options:NSBinarySearchingLastEqual
                       usingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
    NSString *artistName = (NSString *)obj2;
    NSDictionary *artistThumbnail = (NSDictionary *)obj1;
    NSString *artistToCompare = artistThumbnail[_artist_thumb];
    NSComparisonResult result = [artistToCompare compare:artistName];
    return result;
}];

当我使用少于等于 256 个对象的相同代码时,代码工作正常没有崩溃,Obj1Obj2 都有字典对象,但是当数组有 >256 items 然后它崩溃了,我注意到 obj1 和 obj2 与以前不同,总是以 NSDictionary 格式出现。

最佳答案

问题是您的比较对象与数组元素的类型不同。如果您将数组正确键入为 NSArray<NSDictionary *> *你会收到一条警告说参数 indexOfObject应该是 NSDictionary * 类型.

此外,您不能依赖 artist对象总是作为 obj2 传递到比较函数。文档对此没有任何说明,因此您应该假设它可以作为 obj1 传递。有时和obj2其他时间。

要解决它,您可以嵌入 artist在字典中使其与这样的数组元素具有相同的格式 @{ _artist_thumb: artist } .然后以相同的方式从两个参数中检索名称。

NSRange searchRange = NSMakeRange(0, artistThumbnail.count);
index = [artistThumbnail indexOfObject:@{ _artist_thumb: artist }
                                    inSortedRange:searchRange
                                          options:NSBinarySearchingLastEqual
                                  usingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
    NSString *artistName = ((NSDictionary *)obj2)[_artist_thumb];
    NSDictionary *artistThumbnail = (NSDictionary *)obj1;
    NSString *artistToCompare = artistThumbnail[_artist_thumb];
    NSComparisonResult result = [artistToCompare compare:artistName];
    return result;
}];

关于iOS 二分搜索代码在超过 256 项时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56478164/

相关文章:

c# - 如何创建 100 个新对象的数组?

ios - 获取星期几

c - 使用 fgetc() 将文件中的整数值分配给数组

ios - 圆形顶部的UIView

ios - 如何仅在 Swift iOS 的最后一个屏幕上获取导航栏?

ios - 使用 IOS-Swift 读取 firebase 实时数据库子节点

php - 配置 2d php 数组

ios - 在 Objective C 中动态设置和取消设置事件监听器

ios - 在不阻塞 UI 的情况下在 For 循环中添加延迟

ios - 返回时取消 GCD 异步任务