私はCLLocationオブジェクトの配列を持っています。これらのオブジェクトを比較して、開始CLLocationオブジェクトからの距離を取得したいと考えています。数学はまっすぐですが、これを行うための便利な並べ替え記述子があれば私は興味がありますか?私はNSSortDescriptorを避け、カスタム比較メソッド+バブルソートを書くべきですか?私は通常、最大20個のオブジェクトを比較しているので、効率的なスーパーである必要はありません。Cocoa/iPhoneのCLLocationオブジェクトを比較するためのNSSortDescriptor
3
A
答えて
14
自己と他のCLLocationオブジェクト間の距離に応じて、NSOrderedAscending、NSOrderedDescending、NSOrderedSameのいずれかを返すCLLocationの単純なcompareToLocation:カテゴリを記述できます。
NSArray * mySortedDistances = [myDistancesArray sortedArrayUsingSelector:@selector(compareToLocation:)];
編集:
//CLLocation+DistanceComparison.h
static CLLocation * referenceLocation;
@interface CLLocation (DistanceComparison)
- (NSComparisonResult) compareToLocation:(CLLocation *)other;
@end
//CLLocation+DistanceComparison.m
@implementation CLLocation (DistanceComparison)
- (NSComparisonResult) compareToLocation:(CLLocation *)other {
CLLocationDistance thisDistance = [self distanceFromLocation:referenceLocation];
CLLocationDistance thatDistance = [other distanceFromLocation:referenceLocation];
if (thisDistance < thatDistance) { return NSOrderedAscending; }
if (thisDistance > thatDistance) { return NSOrderedDescending; }
return NSOrderedSame;
}
@end
//somewhere else in your code
#import CLLocation+DistanceComparison.h
- (void) someMethod {
//this is your array of CLLocations
NSArray * distances = ...;
referenceLocation = myStartingCLLocation;
NSArray * mySortedDistances = [distances sortedArrayUsingSelector:@selector(compareToLocation:)];
referenceLocation = nil;
}
1
ジャスト(移動するための方法である)カテゴリレスポンスに追加する、忘れないでください:
このように、単にこのような何かを行いますCLLocationインスタンスメソッドを使用することができます:
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
2つの場所オブジェクト間の距離。 Daveの答えを改善する
2
...のiOS 4のよう
、あなたはコンパレータブロックを使用し、静的変数とカテゴリを使用することを避けることができます。
NSArray *sortedLocations = [self.locations sortedArrayUsingComparator:^NSComparisonResult(CLLocation *obj1, CLLocation *obj2) {
CLLocationDistance distance1 = [targetLocation distanceFromLocation:loc1];
CLLocationDistance distance2 = [targetLocation distanceFromLocation:loc2];
if (distance1 < distance2)
{
return NSOrderedAscending;
}
else if (distance1 > distance2)
{
return NSOrderedDescending;
}
else
{
return NSOrderedSame;
}
}];
+0
私はそれが "obj1"、 "obj2"ではなく、 "loc1"、 "loc2"であるべきだと思います。 – Pochi
関連する問題
- 1. データベーススキーマの比較 - SQLオブジェクトの比較
- 2. テキストを比較するためのPDFを比較するためのツールを分析するテストスクリプトで
- 3. オブジェクトのメンバーのための比較演算子のオーバーロード
- 4. ImageViewオブジェクトの比較
- 5. オブジェクトの比較:コンテンツ
- 6. EFのオブジェクト比較
- 7. CLOSオブジェクトを比較する
- 8. itemgetterオブジェクトを比較する
- 9. DateTimeオブジェクトを比較する
- 10. オブジェクト内のプロパティの存在をチェックするための "typeof"と "in"の比較
- 11. Javascriptのオブジェクト値を比較
- 12. オブジェクトの配列を比較する
- 13. powershellのオブジェクトを比較する方法
- 14. Javaの同じオブジェクトを比較する
- 15. Subsonic 2つのオブジェクトを比較する
- 16. 2つのLinqオブジェクトを比較する
- 17. 2つのオブジェクトを深い比較またはjson.stringifyと比較しますか?
- 18. オブジェクトのプロパティの比較
- 19. JavaScriptでのオブジェクトの比較
- 20. jQueryでのオブジェクトの比較
- 21. np.arraysの比較のためのValueError
- 22. 価格比較のためのMysqlクエリ
- 23. 比較のためのPandas可変タイプ
- 24. Aptana Studio 3:比較のためのキーボードショートカット?
- 25. CSVファイル比較のためのPythonスクリプト
- 26. WKNavigationオブジェクトの比較方法
- 27. xmlオブジェクトの比較java
- 28. C#オブジェクト型の比較
- 29. System.ComponentModel.BindingList:Add(オブジェクト)とAddNew()の比較
- 30. RDDオブジェクトの比較 - Apache Spark
あなたがの例を共有することができますこの? –
@ケビン - 私は例を含むように投稿を編集しました –
私はこれをあなたがここに持っているのとまったく同じように実装しようとしました。 static varは常にnilなので、まったくソートしません。何か不足していますか? –