对于按键值范围轻松编制索引的排序数组的任何想法?

时间:2013-08-28 17:42:38

标签: ios arrays sorting

Scenaro:iOS / Objective-C应用程序。我有几十个到几千个条目,我必须通过时间戳按顺序收集和放置。这很容易 - NSArray按描述符排序。

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

我能想到的最好的方法是对数组进行排序,并对起点/终点进行二进制搜索。这肯定是可行的,可能足够快。然而,它并没有“感觉”正确(尽管我无法明确说明原因)。

还有其他想法吗?

1 个答案:

答案 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中的二进制搜索,所以你不必自己做功能。