0

我想对一个 NSMutableArray 进行排序,其中每一行都是一个 NSMutableDictionary,我的 GPS 位置来自 CoreLocation 框架。

这是我的 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;
}

任何人都可以帮助我,还有其他解决方案吗?

亚历克斯。

4

3 回答 3

2

按纬度和经度排序不会为您提供距任何给定坐标最近的位置。作为一个近似值*)你可以使用毕达哥拉斯(你在高中就学过,记得吗?):

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

只需使用键将其添加到您的字典中@"distance"并使用

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

*)这是一个近似值,因为理论上两点之间的距离是椭圆体表面上的一条曲线。

于 2012-10-11T14:17:19.273 回答
0

我认为没有必要实现自己的排序算法。那里有现成的 :-) 我建议看看NSSortDescriptor

而且由于您将地理坐标保存为 NSString 格式,而不是 NSNumber,因此您可能需要编写自己的 NSPredicate 以在您的类中进行 NSString 对象比较。(我不记得@"123" 是否大于@"1.23",我的意思是特殊符号'.')

于 2012-10-11T14:15:37.137 回答
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;
    }
}

看看如何对包含自定义对象的 NSMutableArray 进行排序?

于 2012-10-11T14:13:35.093 回答