2

CGPoints の配列をソートするための最速/最もクリーンな方法を見つけようとしています。ループを使用してこれを達成できると思いますが、それは最速ではない可能性があり、最もクリーンな方法ではないことを願っています. ランダムな CGPoints の配列を取り、最小の x 座標から最大へ、または最小の x座標y 座標から最大へと並べ替えたいと思います。

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()単純な CGPoint の配列しかない場合は、おそらく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 に答える