2012-10-11 51 views
0

我想排序NSMutableArray,其中每行是一個NSMutableDictionary,與我的GPS位置從CoreLocation框架。我的GPS位置排序位置的NSMutableArray

這是我的POI

的陣列
arrayCampi = (
{ 
    cap = 28100; 
    "cell_phone" = ""; 
    championship = "IBL 1D"; 
    citta = Novara; 
    division = ""; 
    email = ""; 
    fax = 0321457933; 
    indirizzo = "Via Patti, 14"; 
    latitude = "45.437174"; 
    league = ""; 
    longitude = "8.596029"; 
    name = "Comunale M. Provini"; 
    naz = Italy; 
    prov = NO; 
    reg = Piemonte; 
    sport = B; 
    surname = "Elettra Energia Novara 2000"; 
    telefono = 03211816389; 
    webaddress = "http://www.novarabaseball.it/"; 
}) 

的一例我需要這個陣列與我的位置(緯度和長)與字段「緯度」和升序模式下的各行的「經度」排序(第一行是離我最近的POI)。

我曾嘗試沒有成功此解決方案:

+ (NSMutableArray *)sortBallparkList:(NSMutableArray *)arrayCampi location:(CLLocation *)myLocation { 

    if ([arrayCampi count] == 0) { 
     return arrayCampi; 
    } 

    if (myLocation.coordinate.latitude == 0.00 && 
     myLocation.coordinate.longitude == 0.00) { 
     return arrayCampi; 
    } 

    NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:arrayCampi]; 

    BOOL finito = FALSE; 
    NSDictionary *riga1, *riga2; 

    while (!finito) { 
     for (int i = 0; i < [sortedArray count] - 1; i++) { 

      finito = TRUE; 
      riga1 = [sortedArray objectAtIndex: i]; 
      riga2 = [sortedArray objectAtIndex: i+1]; 

      CLLocationDistance distanceA = [myLocation distanceFromLocation: 
              [[CLLocation alloc]initWithLatitude:[[riga1 valueForKey:@"latitude"] doubleValue]            
                     longitude:[[riga1 valueForKey:@"longitude"] doubleValue]]]; 
      CLLocationDistance distanceB = [myLocation distanceFromLocation: 
              [[CLLocation alloc]initWithLatitude:[[riga2 valueForKey:@"latitude"] doubleValue] 
                     longitude:[[riga2 valueForKey:@"longitude"] doubleValue]]]; 
      if (distanceA > distanceB) { 
       [riga1 retain]; 
       [riga2 retain]; 

       [sortedArray replaceObjectAtIndex:i+1 withObject:riga2]; 
       [sortedArray replaceObjectAtIndex:i withObject:riga1]; 

       [riga1 release]; 
       [riga2 release]; 

       finito = FALSE; 
      } 
     } 
    } 

    return sortedArray; 
} 

誰能幫助我,還與其他解決方案?

Alex。

+0

Ooopppsss。帶有replaceObjectAtIndex的代碼行是錯誤的。在這種情況下,我什麼都沒做。將riga2與riga1切換並反之亦然就足夠了。完成。 – umpire274

回答

0
[arrayCampi sortedArrayUsingSelector:@selector(compare:)]; 

    - (NSComparisonResult)compare:(NSDictionary *)otherObject { 

    if ([[self objectForKey:@"key"] isEqual:[otherObject objectForKey:@"key"]]) { 
     return NSOrderedSame; 
    } 
    else if (//condition) { 
     return NSOrderedAscending; 
    } 
    else { 
     return NSOrderedDescending; 
    } 
} 

看看How to sort an NSMutableArray with custom objects in it?

0

我覺得沒有必要實現自己的排序算法。有準備好的那些:-)我建議看看NSSortDescriptor

而且由於您保持NSString格式的地理座標,而不是NSNumber,因此您可能需要編寫自己的用於NSString對象的NSPredicate類。 (我不記得@「123」是否大於@「1.23」,我的意思是特殊符號'。')

2

按緯度和長度排序不是給你離任何給定座標最近的位置。作爲近似值*),你可以使用畢達哥拉斯(你瞭解到,在高中的時候,記住):

float distance = sqrtf(powf((origLat-destLat),2)+powf((origLon-destLon), 2)); 

只需添加到您的字典與關鍵@"distance"

NSArray *sorted = [arrayOfDictionaries sortedArrayUsingDescriptors: 
    @[[NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES]]]; 

排序*)這是因爲理論上兩點之間的距離是橢球表面上的曲線。

+0

坦克的蒙迪。好的觀點。 – umpire274