如何知道NSMutable数组中最小的15个对象的索引,并将这些索引存储在另一个数组中 我在objective-c中编写我的程序,我尝试使用for循环,但我还没有能够提出正确的算法。
答案 0 :(得分:0)
最简单的方法是对数组进行排序并选择前15个元素。
更有效的方法是将它们推入具有15个元素上限的二进制堆。数组中的前15个元素直接进入堆中。如果它小于它,则每个后续元素都会替换堆中的最大元素。
CoreFoundation提供了CFBinaryHeap,可用于此目的,但您可以将id
作为void *
进入和退出。还有NDHeap,我一无所知(除了它存在并声称实现二进制堆)。
我的偏好是使用C ++的std::priority_queue
,它已经过全面测试,可以通过一些哄骗来处理id
。
auto lt = [](id a, id b) { return (whatever means "a < b" to you); };
std::priority_queue<id, std::vector<id>, decltype(lt)> pq{lt};
for (id e in myarray) {
if (pq.size() == 15 && lt(e, pq.top()))
pq.pop();
if (pq.size() < 15)
pq.push(e);
}
NSMutableArray * top15 = [NSMutableArray arrayWithCapacity:15];
while (!pq.empty()) {
[top15 addObject:pq.top()];
pq.pop();
}
要使用此代码,您必须将相关的.m文件重命名为.mm。