在iOS/macOS开发中,NSArray和NSDictionary是Foundation框架中最常用的集合类。当我们需要对包含NSDictionary对象的NSArray进行排序时,通常需要根据字典中的某个键(key)对应的值(value)来排序。
Objective-C提供了几种方法来对NSArray中的NSDictionary对象进行排序:
sortedArrayUsingComparator:
- 使用block进行排序sortedArrayUsingDescriptors:
- 使用NSSortDescriptor排序sortedArrayUsingSelector:
- 使用selector方法排序NSArray *unsortedArray = @[
@{@"name": @"John", @"age": @25},
@{@"name": @"Alice", @"age": @30},
@{@"name": @"Bob", @"age": @20}
];
// 按age升序排序
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *dict1, NSDictionary *dict2) {
NSNumber *age1 = dict1[@"age"];
NSNumber *age2 = dict2[@"age"];
return [age1 compare:age2];
}];
// 按name升序排序
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *sortedArray = [unsortedArray sortedArrayUsingDescriptors:@[sortDescriptor]];
// 多条件排序:先按age降序,再按name升序
NSSortDescriptor *ageDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
NSSortDescriptor *nameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *sortedArray = [unsortedArray sortedArrayUsingDescriptors:@[ageDescriptor, nameDescriptor]];
// 假设字典中的值都是NSString类型,按name排序
NSArray *sortedArray = [unsortedArray sortedArrayUsingSelector:@selector(compare:)];
原因:尝试访问不存在的键会导致nil值,排序时可能崩溃。
解决方案:在排序前检查键是否存在或提供默认值。
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *dict1, NSDictionary *dict2) {
NSNumber *age1 = dict1[@"age"] ?: @0; // 提供默认值
NSNumber *age2 = dict2[@"age"] ?: @0;
return [age1 compare:age2];
}];
原因:字典中的值可能是不同类型(NSString, NSNumber等),直接比较可能导致异常。
解决方案:统一数据类型或自定义比较逻辑。
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *dict1, NSDictionary *dict2) {
id value1 = dict1[@"key"];
id value2 = dict2[@"key"];
if ([value1 isKindOfClass:[NSString class]] && [value2 isKindOfClass:[NSString class]]) {
return [value1 compare:value2];
} else if ([value1 isKindOfClass:[NSNumber class]] && [value2 isKindOfClass:[NSNumber class]]) {
return [value1 compare:value2];
}
// 其他情况处理
return NSOrderedSame;
}];
原因:大型数组排序可能影响性能。
解决方案:
以上方法在Objective-C中都能有效工作,选择哪种方法取决于具体需求和代码风格偏好。
没有搜到相关的文章