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