我已经对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实现来优化它吗?
答案 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;