1

场景:iOS/Objective-C 应用程序。我必须收集几十到几千个条目,并按时间戳排序。这很容易—— NSArray 按描述符排序。

但是,我需要能够访问数组并按时间范围选择多个条目(其中开始/结束时间可能不完全对应于任何条目)。这对于设置时间和访问时间都是适度的性能敏感。

我能想到的最好的办法是对数组进行排序并对起点/终点进行二进制搜索。这当然是可行的,并且可能足够快。然而,它并不完全“感觉”正确(尽管我无法解释为什么)。

还有其他想法吗?

4

1 回答 1

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 中进行二分搜索,所以你不必做你自己的函数。

于 2013-08-28T17:50:17.657 回答