2010-12-15 7 views
0

Ich lese Zeilen aus SQLite-Tabelle, dann dynamisch ein Objekt erstellen und dann das Objekt zu einem NSMutableArray hinzufügen. Mein Problem ist, dass ich nicht in der Lage bin, einen Weg zu finden, die Objekte in dem Array basierend auf dem Distanzattribut dynamisch zu sortieren (was ein Double ist), da ich jedes Objekt zu dem NSMutableArray in einer For-Schleife hinzufüge größten.Wie man ein NSMutableArray in Objective-C dynamisch sortiert?

Mein entsprechenden Code sieht wie folgt aus:

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); 

} 

Sobald diese Funktion seinen Lauf beendet hat, sollte die Restaurants Array ein sortiertes Array mit Restaurant Objekte, die in der Reihenfolge der nächsten (kleinster Abstand doppelten Wert) sind am weitesten (größter Abstand, doppelter Wert).

+1

Wie Sie die Objekte in das Array bekommen, ist nicht wichtig, so ist dies wirklich genau die gleiche wie [Wie ein NSMutableArray mit benutzerdefinierten Objekten sortieren?] (Http://stackoverflow.com/questions/805547/how-to-sort-ein-nsmutablearray-with-custom-objects-in-it) –

Antwort

3

Verwenden Sie NSMutableArrays sortUsingSelector, um eine Vergleichsfunktion für Ihr Restaurant-Objekt aufzurufen.

@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

Vielen Dank für Ihre schnelle Antwort. Ich schätze Ihre Hilfe bei der Lösung sehr! – syedfa

Verwandte Themen