场景:iOS/Objective-C 应用程序。我必须收集几十到几千个条目,并按时间戳排序。这很容易—— NSArray 按描述符排序。
但是,我需要能够访问数组并按时间范围选择多个条目(其中开始/结束时间可能不完全对应于任何条目)。这对于设置时间和访问时间都是适度的性能敏感。
我能想到的最好的办法是对数组进行排序并对起点/终点进行二进制搜索。这当然是可行的,并且可能足够快。然而,它并不完全“感觉”正确(尽管我无法解释为什么)。
还有其他想法吗?
1)对数组进行排序(可选,但你说你需要)
2)代替二分查找,使用 NSPredicate 查找您感兴趣的条目。
这是我的一个项目的示例代码,您必须适应您自己的类,即具有时间戳的类。
// this is the property wher you store the data
@property NSArray *data;
// this is a custom struct to hold to timestamp values, the min and max
typedef struct CMTTimeStampRange {
UInt64 min, max;
} CMTTimeStampRange;
// return a sub array with only the objects between two time stamps
- (NSArray *)samplesInTimeStampRange:(CMTTimeStampRange)timeStampRange
{
NSArray *tsRange = @[@(timeStampRange.min), @(timeStampRange.max)];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"timeStamp BETWEEN %@",tsRange];
NSArray *samples = [self.data filteredArrayUsingPredicate:filter];
return samples;
}
更新
上面的这段代码旨在为发布的问题提供一个简单的解决方案,而不是高性能代码。为了获得高性能,我建议使用 Core Foundation (CFArray) 和 C 函数。CFArray 有一个函数 CFArrayBSearchValues 是在一个排序的 CFArray 中进行二分搜索,所以你不必做你自己的函数。