Как отсортировать массив, который содержит дату в строках в порядке убывания?
Я хочу отсортировать массив, содержащий строку даты, в порядке убывания, я пробовал SO ответы, но я получаю неправильный вывод.
Пожалуйста, смотрите мой код, как показано ниже:
NSArray *dateArray=[NSArray arrayWithObjects:@"01/12/2012",@"01/26/2011",@"02/09/2005",@"02/24/2006",@"03/19/2007",@"07/14/2011",@"08/17/2007",@"10/04/2007",@"10/31/2006",@"12/05/2012",@"12/06/2006",@"12/23/2008",nil];
NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
[formatter setDateFormat:@"MM/DD/YYYY"];
NSMutableArray *tempArr=[[NSMutableArray alloc]init];
for (int i=0; i<[dateArray count]; i++) {
NSString *dt=[dateArray objectAtIndex:i];
NSDate *newDt=[formatter dateFromString:dt];
[tempArr addObject:newDt];
}
NSLog(@"tempArr is %@",tempArr);
Я получаю вывод консоли, как показано ниже:
2013-08-27 15: 29: 50.418 sample [3688: c07] tempArr is ("2011-12-24 18:30:00 +0000", "2010-12-18 18:30:00 +0000", " 2004-12-18 18:30:00 +0000 "," 2005-12-24 18:30:00 +0000 "," 2006-12-23 18:30:00 +0000 "," 2010-12-18 18:30:00 +0000 "," 2006-12-23 18:30:00 +0000 "," 2006-12-23 18:30:00 +0000 "," 2005-12-24 18:30:00 +0000 "," 2011-12-24 18:30:00 +0000 "," 2005-12-24 18:30:00 +0000 "," 2007-12-22 18:30:00 +0000 ")
Я не знаю, почему вместо месяца указывается "12", а также формат даты, который не соответствует указанному мною формату.
3 ответа
Ну, во-первых, вы на самом деле ничего не сортируете в своем коде...
Вы должны сделать что-то вроде этого...
// create the string array
NSArray *dateArray = @[@"01/12/2012", @"01/26/2011", @"02/09/2005", @"02/24/2006", @"03/19/2007", @"07/14/2011", @"08/17/2007", @"10/04/2007", @"10/31/2006", @"12/05/2012", @"12/06/2006", @"12/23/2008"];
// create the date formatter with the correct format
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM/dd/yyyy"];
NSMutableArray *tempArray = [NSMutableArray array];
// fast enumeration of the array
for (NSString *dateString in dateArray) {
NSDate *date = [formatter dateFromString:dateString];
[tempArray addObject:date];
}
// sort the array of dates
[tempArray sortUsingComparator:^NSComparisonResult(NSDate *date1, NSDate *date2) {
// return date2 compare date1 for descending. Or reverse the call for ascending.
return [date2 compare:date1];
}];
NSLog(@"%@", tempArray);
РЕДАКТИРОВАТЬ, ЧТОБЫ СДЕЛАТЬ В STRING ARRAY
NSMutableArray *correctOrderStringArray = [NSMutableArray array];
for (NSDate *date in tempArray) {
NSString *dateString = [formatter stringFromDate:date];
[correctOrderStringArray addObject:dateString];
}
NSLog(@"%@", correctOrderStringArray);
Кроме того, читайте больше о NSDate
, NSString
а также NSDateFormatter
, Особенно как они взаимодействуют друг с другом.
NSDate
это момент времени. Он не содержит (и никогда не содержит) информацию о форматировании.
NSDateFormatter
не содержит никакой информации о конкретной дате (т.е. момент времени). Он используется, чтобы взять дату и создать строку на основе NSDate
и format
что вы даете это.
Пытаться
[formatter setDateFormat:@"MM/dd/yyyy"]
Вместо того, что у вас есть в строке 3. Это должно дать вам ожидаемый формат даты. Что касается сортировки, я немного запутался. У вас нет кода, который сортирует. Вы пытаетесь отсортировать или просто отформатировать строку даты?
Вы должны построить себе подходящий компаратор:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[formatter setLocale:enUSPOSIXLocale];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[formatter setDateFormat:@"MM/dd/yyyy"];
NSComparator myDateComparator = ^NSComparisonResult(id obj1,
id obj2) {
NSDate *date1 = [formatter dateFromString:obj1];
NSDate *date2 = [formatter dateFromString:obj2];
return [date2 compare:date1]; // sort in descending order
};
затем просто отсортируйте массив, выполнив:
NSArray *dateArray = @[@"01/12/2012", @"01/26/2011", @"02/09/2005",
@"02/24/2006", @"03/19/2007", @"07/14/2011",
@"08/17/2007", @"10/04/2007", @"10/31/2006",
@"12/05/2012", @"12/06/2006", @"12/23/2008"];
NSArray *sortedArray = [dateArray sortedArrayUsingComparator:myDateComparator];
NSLog(@"Sorted array is %@", sortedArray);
Это сортирует строки (а не любой измененный массив). Вы также можете использовать манипуляции со строками и конвертировать m/d/y в ymd, но я думаю, что для небольших наборов данных этот подход был бы приемлемым.