2

我试图弄清楚对 CGPoints 数组进行排序的最快/最干净的方法是什么。我想我可以使用循环来实现这一点,但这可能不是最快的,我希望它不是最干净的方式。我想获取一个随机 CGPoints 数组,并按最小 x 坐标到最大或最小 xy 坐标到最大对它们进行排序。

4

3 回答 3

9

在 Chuck 发表正确评论后,我使用 sortUsingComparator 方法更新了答案:

这是带有示例数据的完整代码:

首先,我们生成 100 个随机值并输入到数组中:

NSMutableArray *testArray = [[NSMutableArray alloc] initWithCapacity:100];
for (int i=0; i<100; i++) {
    CGPoint testPoint = CGPointMake(arc4random()%100, arc4random()%100);
    [testArray addObject:[NSValue valueWithCGPoint:testPoint]];
}

这是对数组进行排序的实际代码:

[testArray sortUsingComparator:^(id firstObject, id secondObject) {
    CGPoint firstPoint = [firstObject CGPointValue];
    CGPoint secondPoint = [secondObject CGPointValue];
    return firstPoint.x>secondPoint.x;
}];

最后,我们可以通过打印它来验证数组是否已排序:

NSLog(@"%@",testArray);
于 2012-05-22T19:15:41.967 回答
3

qsort()如果你只有一个简单的 CGPoints 数组,C函数可能是你最好的选择。像这样的东西:

int compareXCoords(CGPoint *a, CGPoint *b) {
    return b->x - a->x;
}

// Later:

CGPoint points[100];
// initialize points somehow
qsort(points, 100, sizeof(CGPoint), compareXCoords);
// points is now sorted by the points' x coordinates
于 2012-05-22T19:12:47.390 回答
0

根据我的评论,这是一个很好的解决方案,将它们插入到 NSMutableArray 上,保持您决定的排序。

你必须做这样的事情:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:1];

CGPoint candidate;
// Look for the position it has to be
int 0;
for (CGPoint point in array) {
    i++;
    // Compare candidate with current point
    // You have to define this condition, when point is greater than candidate
    if (point > candidate) {
        break;
    }
}
[array insertObjectAtIndex:i-1];

也许我的代码有一些错误,我现在无法检查它是否正确。

于 2012-05-22T19:24:39.510 回答