2010-12-15 74 views
0

我从SQLite表中检索行,然后动态创建一个对象,然后将该对象添加到NSMutableArray。我的问题是,我无法找出一种方法来动态排序基于距离属性(这是一个双精度)的数组中的对象,因为我将每个对象添加到for循环中的NSMutableArray,从最小值到最大值最大。如何动态地对Objective-C中的NSMutableArray进行排序?

我的相关代码如下所示:

sqlite3 *database; 

//Init the restaurant array 
restaurants = [[NSMutableArray alloc] init]; 

CLLocation *firstLocation = [[[CLLocation alloc] initWithLatitude:userLatitude longitude:userLongitude] autorelease]; 

//Open the database from the users filesystem 
if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 

    //setup the SQL statement and compile it for faster access 
    const char *sqlStatement = "select * from restaurant"; 
    sqlite3_stmt *compiledStatement; 

    if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 

     //loop through the results and add them to the feeds array 
     while (sqlite3_step(compiledStatement) == SQLITE_ROW) { 

      //read the data from the result row 
      NSString *aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 
      NSString *aAddress = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)]; 
      NSString *aCity = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)]; 
      NSString *aProvinceState = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 4)]; 
      NSString *aPostalZipCode = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)]; 
      NSString *aCountry = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 6)]; 
      NSString *aPhoneNumber = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 7)]; 
      NSString *aHours = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 8)]; 
      double aLat = sqlite3_column_double(compiledStatement, 9); 
      double aLon = sqlite3_column_double(compiledStatement, 10); 

      CLLocation *secondLocation = [[[CLLocation alloc] initWithLatitude:aLat longitude:aLon] autorelease]; 
      CLLocationDistance restDistance = [secondLocation distanceFromLocation:firstLocation]; 

      CLLocationDistance distanceKm = restDistance/1000.0; 

      NSString *aDist = [[NSString alloc] initWithFormat: @"%f", distanceKm]; 

      Restaurant *restaurant = [[Restaurant alloc] initWithName:aName address:aAddress city:aCity provinceState:aProvinceState postalZipCode:aPostalZipCode country:aCountry phoneNumber:aPhoneNumber hours:aHours latitude:aLat longitude:aLon distance:aDist]; 

      //add the restaurant object to the restaurant array 
      [restaurants addObject:restaurant]; 

      [restaurant release]; 

     } 


    } 

    sqlite3_finalize(compiledStatement); 

} 

sqlite3_close(database); 

} 

一旦这个功能已经完成它的过程中,餐馆阵列应该是排序包含数组餐厅的对象是在最近的(最小距离双值)以最远(最大距离双倍值)。

+1

你怎么弄的对象放入数组并不重要,所以这是真的就如同[如何一个NSMutableArray与它的自定义对象进行排序?](http://stackoverflow.com/questions/805547/how-to-sort-an-nsmutablearray -with-custom-objects-it-it) – 2010-12-15 01:12:02

回答

3

使用NSMutableArray的sortUsingSelector在您的Restaurant对象上调用比较函数。

@implementation Restaurant 

- (double) distance { return _distance; } 

- (NSComparisonResult) compareDistance:(Restaurant *) iRHS { 
    double      lhs, rhs; 

    lhs = [self distance]; 
    rhs = [iRHS distance]; 

    if (lhs < rhs) return NSOrderedAscending; 
    if (lhs > rhs) return NSOrderedDescending; 

    return NSOrderedSame; 
} 


@end 

... 

[restaurants sortUsingSelector: @selector(compareDistance:)]; 
+0

非常感谢您的及时回复。我非常感谢您对解决方案的帮助! – syedfa 2010-12-19 18:36:24

相关问题