2010-12-15 7 views
0

SQLiteテーブルから行を取得してから、オブジェクトを動的に作成してから、そのオブジェクトをNSMutableArrayに追加します。私の問題は、配列のオブジェクトを動的に並べ替える方法を見つけ出すことができないということです。距離属性(double型)に基づいて、各オブジェクトを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); 

} 

この関数はそのコースを終えた後は、レストランの配列が最も近い(最小距離double値)の順になっているレストランのオブジェクトを含むソートされた配列でなければなりませんへ最も遠い(最大距離の2倍の値)。

+1

重要ではありませんので、これは本当にとして全く同じである[それにカスタムオブジェクトをNSMutableArrayのをソートする方法?](http://stackoverflow.com/questions/805547/how-to-sort-an-nsmutablearray-with-custom-objects-in-it) –

答えて

3

NSMutableArrayのsortUsingSelectorを使用すると、レストランオブジェクトで比較関数を呼び出すことができます。あなたは配列にオブジェクトを取得する方法

@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

関連する問題