优化CFArray中的搜索

时间:2011-07-27 17:59:58

标签: objective-c arrays optimization search binary-search

我已经对CFArray进行了排序,我需要找到一个值的索引。但是我也不确定这个值是否在这个数组中,所以我也需要知道这个。

现在我使用这段代码:

NSInteger valueIndex;
    BOOL valueExactMatch = CFArrayContainsValue((CFArrayRef)sortedBorders, arrayRange, value);
    if (valueExactMatch)
        valueIndex = CFArrayGetFirstIndexOfValue((CFArrayRef)sortedBorders, arrayRange, value);
    else
        valueIndex = CFArrayBSearchValues((CFArrayRef)sortedBorders, arrayRange, value, (CFComparatorFunction) CFDateCompare, nil);

但据我了解,valueExactMatch正在计算两次 - 一次在CFArrayContainsValue中,一次执行实际搜索。

我可以使用现有的CFArray实现来优化它吗?

1 个答案:

答案 0 :(得分:1)

如果没有匹配,

CFArrayGetFirstIndexOfValue会返回-1,因此您可以像这样使用它:

NSInteger valueIndex = CFArrayGetFirstIndexOfValue((CFArrayRef)sortedBorders, arrayRange, value);
if (valueIndex == -1)
    valueIndex = CFArrayBSearchValues((CFArrayRef)sortedBorders, arrayRange, value, (CFComparatorFunction) CFDateCompare, nil);

我没有配备XCode的机器,但这也可行:

Boolean found = false;
NSInteger valueIndex = CFArrayBSearchValues((CFArrayRef)sortedBorders, arrayRange, value, (CFComparatorFunction) CFDateCompare, nil);
if (valueIndex < CFArrayGetCount(sortedBorders) && CFArrayGetValueAtIndex(sortedBorders, valueIndex) == value)
  found = true;