0

現在、「cachedDist」列がdoubleとして設定されているSQLDBから情報を取得しています。ただし、アプリにプルして配列を作成すると、文字列に変換され、並べ替えが明らかにオフになります。18.15は2.15より前になります。距離を文字列ではなくDoubleとしてソートするように、コードでこれを修正するにはどうすればよいですか?

Barオブジェクト内。

NSString *cachedDist
@property(nonatomic,copy) NSString *cachedDist;

@synthesize cachedDist;

ViewControllerのwhileループ。

while (sqlite3_step(sqlStatement)==SQLITE_ROW) {
            Bar * bar = [[Bar alloc] init];
            bar.barName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,1)];
            bar.barAddress = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,2)];
            bar.barCity = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 3)];
            bar.barState = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 4)];
            bar.barZip = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 5)];
            bar.barLat = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 8)];
            bar.barLong = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 9)];

            if (currentLoc == nil) {
                NSLog(@"current location is nil %@", currentLoc);
            }else{

            CLLocation *barLocation = [[CLLocation alloc] initWithLatitude:[bar.barLat doubleValue] longitude:[bar.barLong doubleValue]];
            bar.cachedDist = [NSNumber numberWithDouble:[currentLoc distanceFromLocation: barLocation]/1000];

            [thebars addObject:bar];

            }

私の並べ替え

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"cachedDist"  ascending:YES];
sortedArray = [thebars sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];

return sortedArray;
4

1 に答える 1

0

NSStringには、doubleValueこれを非常に単純にするメソッドがあります。

double cachedDistance = [cachedDistanceString doubleValue];

これをカスタムコンパレータで並べ替えに使用するか、プロパティをNSNumberまたはdoubleにして、並べ替えをはるかに簡単にすることができます。(どのように並べ替えているのかわかりません...)

編集:

私はあなたのコードを再評価しました、そして今、私たちはダブルからストリング、そしてダブルに移行しているように見えます...いわば仲介者を切り取ることができます。

@prototypeセクションで、@propertyを変更します。

// @property(nonatomic,copy) NSString *cachedDist; // old way
@property(nonatomic) double cachedDist;

次に、次のように割り当てます。

bar.cachedDistance = [currentLoc distanceFromLocation: barLocation]/1000;

遠くから文字列を作成する線を削除します(実際には単なるダブルです)。

あるいは、よりオブジェクト指向にしたい場合は、NSNumberオブジェクトを使用できます(すべきですか?)。

@property(nonatomic,copy) NSNumber *cachedDist;
...
bar.cachedDistance = [NSNumber numberWithDouble:[currentLoc distanceFromLocation: barLocation]/1000];
于 2012-07-08T23:42:04.920 に答える