使用每个元素对数组进行排序包含一个 NSString 和一个 NSNumber(双)条目

Sorting an array with each element contains an NSString and an NSNumber (double) entry

我创建了一个包含两个元素的 NSMutableArray;城市名称(索引 0 处的字符串)和距我当前位置的距离(索引 1 处的两倍)。

for (i=0;i<[City count];++i)
{
distanceFromMe = [Location distanceFromLocation:[cityLocation]];
[a addObject:[cityNames objectatIndex:i]];
[a addObject:@(distanceFromMe)]
[cityArray addObject:a]
}

"Chicago", 560.34

"New York", 204.3456

"Syracuse", 50.04

我想按距离升序对这个数组进行排序。

"Syracuse", 50.04

"New York", 204.3456

"Chicago", 560.34

我用过:

[cityArray sortUsingDescriptors:@[ [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES] ]];

但我不断收到发送到实例的无法识别的选择器错误。 在我的阅读中,该方法似乎不需要密钥,因为数组元素中只有一个 NSNumber 。我已经阅读了许多关于此的不同主题,但 none 似乎适用。

如有任何帮助,我们将不胜感激。使用 xcode obj-c 而不是 swift.

我会在不使用排序描述符的情况下执行此操作。

[cityArray sortUsingComparator:
    ^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        NSArray* arr1 = obj1;
        NSArray* arr2 = obj2;
        return [arr1[1] compare: arr2[1]];
    }];

虽然@JWWalker 的解决方案有效,但我建议对此进行一些不同的建模。

具体来说,创建一个 class 来保存 city/distance 对:

@interface CityDistance
@property(copy) NSString *name;
@property(copy) NSNumber *distance;
@end

@implementation CityDistance
@end

存储每个 city/distance 对。

CityDistance *cityDistance = [[CityDistance alloc] init];
cityDistance.name = @"New York";
cityDistance.distance = @(560.3);

NSMutableArray <CityDistance *>*cities = [NSMutableArray array];
[cities addObject: cityDistance];

这允许编译器做更多的类型检查,你可以将业务逻辑挂在 class 之外(即可能是 -(NSNumber *)distanceFromCity:(CityDistance *)otherCity; 方法?),它不那么脆弱(哎呀!忘了添加到我模糊数组的距离!)并使排序代码更清晰:

[cityArray sortUsingComparator:
    ^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        CityDistance* city1 = obj1;
        CityDistance* city2 = obj2;
        return [city1.name compare: city2.name];
    }];