按双值而不是字符串值排序

时间:2012-07-08 18:58:53

标签: xcode ios5

我正在从sql DB中提取信息,其中'cachedDist'列设置为double。然而,当我把它拉到我的应用程序并创建我的数组时,我把它变成一个字符串,然后排序显然会关闭,18.15将在2.15之前出现。如何在我的代码中修复它,以便将距离排序为Double而不是String?

在Bar对象中。

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

@synthesize cachedDist;

我在视图控制器中的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;

1 个答案:

答案 0 :(得分: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];