iOS开发:如何对包含年月组合的NSString数组进行降序排序?
解决iOS年月字符串数组的排序问题
首先我得先指出你代码里的几个关键问题,这些问题直接导致你没得到预期结果:
- 数组初始化错误:你当前创建的
array其实只包含一个字符串元素(整个逗号分隔的内容),而不是多个独立的年月字符串,得先把这个字符串拆分成单独的元素数组才能正常排序。 - 日期格式符错误:你用了
@"mmyyyy",这里的mm代表的是分钟,月份应该用大写的MM,正确格式是@"MMyyyy"。 - 排序方向问题:你想要的是降序排列(最新的年月在前),但当前的比较器是升序逻辑(旧的在前),需要反转比较结果来实现降序。
接下来是修正后的完整代码:
// 1. 先处理原始字符串,拆分成独立的年月字符串数组 NSString *dateString = @"042018, 052018, 122018, 012019, 022019, 032019"; NSArray *originalArray = [dateString componentsSeparatedByString:@", "]; // 2. 初始化日期格式化器,使用正确的月份格式符 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"MMyyyy"; // 补充:设置固定locale避免不同地区的解析差异 dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; // 3. 定义降序比较器 NSComparator dateComparator = ^(NSString *str1, NSString *str2) { NSDate *date1 = [dateFormatter dateFromString:str1]; NSDate *date2 = [dateFormatter dateFromString:str2]; // 反转比较结果,实现降序排列 return [date2 compare:date1]; }; // 4. 执行排序 NSArray *sortedArray = [originalArray sortedArrayUsingComparator:dateComparator]; NSLog(@"排序后的数组:%@", sortedArray);
运行这段代码后,输出结果就是你预期的:
(032019, 022019, 012019, 122018, 052018, 042018)
另外补充两个细节:
- 设置
en_US_POSIXlocale是为了避免不同系统语言环境下的日期解析差异,确保无论设备语言是什么,都能稳定解析MMyyyy格式的字符串。 - 如果你的原始数组本来就是包含多个独立年月字符串的(可能是你初始化时的笔误),那可以跳过第一步的拆分,直接用正确的数组执行后续排序逻辑。
内容的提问来源于stack exchange,提问作者Some Person
相关产品推荐
相关产品推荐

