Objective-C中多维数组按首元素字母排序失败的解决方法求助
多维数组按子数组首元素排序的解决方案
你之前的代码无效的核心原因是:错误地对elementsArray[0](第一个子数组)执行排序操作,而非对包含所有子数组的整个大数组elementsArray排序。下面提供几种可行的实现方式:
方式一:使用排序函数
基于你尝试过的函数式排序,修正后代码如下:
static NSInteger sortByFirstElement(id a, id b, void *context) { // 取出每个子数组的第一个NSString元素 NSString *strA = [a objectAtIndex:0]; NSString *strB = [b objectAtIndex:0]; // 不区分大小写比较 return [strA caseInsensitiveCompare:strB]; } // 对整个大数组排序 NSArray *sortedArray = [elementsArray sortedArrayUsingFunction:sortByFirstElement context:NULL];
方式二:使用Block排序(推荐)
Objective-C支持用Block直接编写排序逻辑,代码更简洁直观,无需单独定义函数:
NSArray *sortedArray = [elementsArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSString *str1 = [obj1 objectAtIndex:0]; NSString *str2 = [obj2 objectAtIndex:0]; return [str1 caseInsensitiveCompare:str2]; }];
额外优化建议:用自定义模型替代多维数组
如果业务场景允许,建议创建自定义类封装这三个关联数据,代码可读性和可维护性会大幅提升:
// 定义模型类 @interface ItemModel : NSObject @property (nonatomic, copy) NSString *mainString; @property (nonatomic, strong) NSNumber *numericValue; @property (nonatomic, copy) NSString *secondaryString; @end // 排序时直接访问属性 NSArray *sortedModels = [itemModelsArray sortedArrayUsingComparator:^NSComparisonResult(ItemModel *model1, ItemModel *model2) { return [model1.mainString caseInsensitiveCompare:model2.mainString]; }];
注意事项
- 确保
elementsArray是包含多个子数组的顶层数组,每个子数组至少包含3个元素,且第一个元素为NSString类型 - 排序后的数组会保留每个子数组内三个元素的关联关系,仅调整顶层数组的元素顺序
内容的提问来源于stack exchange,提问作者ScottHa
相关产品推荐
相关产品推荐

