我有以下字符串数组。
NSArray *array = [NSArray arrayWithObject:@"042018, 052018, 122018, 012019, 022019, 032019"];
我想按MonthYear组合的顺序对该数组进行排序,即032019在122018之前。
结果应给出
(032019,022019,012019,122018,052018,042018)
我尝试过此代码,但未给出满意的结果。请帮助。
NSDateFormatter *fmtDate = [[NSDateFormatter alloc] init];
[fmtDate setDateFormat:@"mmyyyy"];
NSComparator compareDates = ^(id string1, id string2)
{
NSDate *date1 = [fmtDate dateFromString:string1];
NSDate *date2 = [fmtDate dateFromString:string2];
return [date1 compare:date2];
};
NSArray *sortedYearKeys = [[dicSection allKeys] sortedArrayUsingComparator:compareDates];
NSLog(@"array:%@",sortedYearKeys);
我知道了你的问题。实际上有两个问题。
array
仅包含一个对象,即NSString
,因此首先您需要将该字符串转换为NSArray
,我的意思是需要分隔内部日期对象。您可以通过NSString
的方法componentsSeparatedByString
来做到这一点。
因此,在将其转换为数组组件之前,您需要从字符串中删除所有空格。
让我们一一看。您指定的数组。
NSArray *array = [NSArray arrayWithObject:@"042018, 052018, 122018, 012019, 022019, 032019"];
从此数组获取字符串
NSString *dateString = array[0];
现在,此字符串包含空格,这是此处的问题。
// Remove extra characters like whitespace from your string
NSString *dateString = array[0];
//Output: 042018, 052018, 122018, 012019, 022019, 032019
NSString *trimmedString = [dateString stringByReplacingOccurrencesOfString:@" " withString:@""];
//Output: 042018,052018,122018,012019,022019,032019
您可以观察到以上输出中的空格,该空格在trimmedString
中已删除。
将字符串转换为数组:
NSArray *dateArray = [trimmedString componentsSeparatedByString:@","];
最后一步是对该数组进行排序
NSArray *sortedArray = [dateArray sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setDateFormat:@"MMyyyy"];
NSDate *date1 = [formatter dateFromString:obj1];
NSDate *date2 = [formatter dateFromString:obj2];
return ([date1 compare:date2] == NSOrderedAscending) ? YES : NO;
}];
NSLog(@"sortedArray :%@\n", sortedArray);
// Output: (
032019,
022019,
012019,
122018,
052018,
042018
)
如果您希望将其转换为字符串,则可以使用方法componentsJoinedByString
来完成
NSString *sortedString = [sortedArray componentsJoinedByString:@", "];
请注意,我在,
之后添加了一个额外的空格以匹配您期望的结果。
//Output: 032019, 022019, 012019, 122018, 052018, 042018
这是针对具有此类奇怪要求的任何人,在Words中,我要做的是,我为每个字符串添加了静态01作为Date,然后应用Date排序,然后在获得所需结果后,我希望按相反的顺序进行操作,因此我将结果数组求逆,然后将多余的内容删除我之前添加的01。
NSMutableArray *array = [NSMutableArray arrayWithArray:[dicSection allKeys]];
int i =0;
for(;i<(int)array.count;){
NSString *str = [array objectAtIndex:i];
str = [NSString stringWithFormat:@"01%@",str];
[array replaceObjectAtIndex:i withObject:str];
i++;
}
NSDateFormatter *fmtDate = [[NSDateFormatter alloc] init];
[fmtDate setDateFormat:@"ddmmyyyy"];
NSComparator compareDates = ^(id string1, id string2)
{
NSDate *date1 = [fmtDate dateFromString:string1];
NSDate *date2 = [fmtDate dateFromString:string2];
return [date1 compare:date2];
};
NSArray *sortedYearMothKeys = [array sortedArrayUsingComparator:compareDates];
sortedYearMothKeys = [NSMutableArray arrayWithArray:[[sortedYearMothKeys reverseObjectEnumerator] allObjects]];