Scenaro:iOS / Objective-C应用程序。我有几十个到几千个条目,我必须通过时间戳按顺序收集和放置。这很容易 - NSArray按描述符排序。
但是,我需要能够访问数组并按时间范围选择多个条目(其中开始/结束时间可能与任何条目不完全对应)。这对于设置时间和访问时间都是适度的性能敏感。
我能想到的最好的方法是对数组进行排序,并对起点/终点进行二进制搜索。这肯定是可行的,可能足够快。然而,它并没有“感觉”正确(尽管我无法明确说明原因)。
还有其他想法吗?
答案 0 :(得分:1)
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中的二进制搜索,所以你不必自己做功能。