使用每个元素对数组进行排序包含一个 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];
}];
我创建了一个包含两个元素的 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];
}];