2011-07-27 73 views
1

我对CFArray进行了排序,我需要找到一个值的索引。但我也不确定这个值是否在这个数组中,所以我也需要知道这个。在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

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; 
+0

它不执行两个完整的二进制搜索吗?它似乎应该更慢,不是吗? –

+0

在您的代码中,您正在搜索数组一次以获取valueExactMatch,然后再次使用'CFArrayGetFirstIndexOfValue'或'CFArrayBSearchValues'获取索引。在我的代码中,我搜索了一次索引,如果找到了,就完成了。它只会再次搜索是否不匹配。 – highlycaffeinated

+0

错了。谢谢 –