Как отсортировать массив, содержащий даты в iphone SDK
У меня есть массив, который содержит строки даты, такие как
"15.09.2011, 12:00:00", "15.10.2011, 12:00:00", "16.11.2011, 12:00:00"
Как я могу отсортировать этот массив в порядке убывания? Порядок должен быть отсортирован сначала по году, затем по месяцу, затем по дате, а затем по времени.
Пожалуйста, поделитесь своими идеями. Спасибо
5 ответов
Сортировка NSDates, пока они в формате NSString, практически невозможна, за исключением случаев, когда они имеют формат "YYYYMMddHHmmss", который можно сортировать как строки сортировки. См. Ответ @Daniel R Hicks.
Преобразуйте строку в NSDate, пока вы анализируете и добавляете даты из веб-службы.
NSString *dateStr = ...
NSDateFormatter *df = ;[NSDateFormatter alloc] init];
[df setDateFormat:@"M/dd/YYYY hh:mm:ss a"];
[datesArray addObject:[df dateFromString:dateStr]];
И сортировка,
[datesArray sortUsingSelector:@selector(compare:)];
Попробуйте приведенный ниже код. это даст дату сортировки в порядке возрастания.
NSMutableArray *arraydate=[[NSMutableArray alloc] init];
[arraydate addObject:@"22/7/2010"];
[arraydate addObject:@"1/1/1988"];
[arraydate addObject:@"22/7/1966"];
[arraydate addObject:@"22/7/2000"];
[arraydate addObject:@"1/7/2010"];
[arraydate sortUsingSelector:@selector(compare:)];
NSLog(@"array=%@",[arraydate description]);
Если они уже являются строками, вы можете либо преобразовать их в NSDates (и, следовательно, в NSTimeIntervals) и отсортировать их, либо эффективно переставить цифры в YYMMDDHHmmss, где HH был преобразован в представление 00-23.
Либо можно сделать с помощью вызова sortUsingFunction.
Есть метод для сравнения двух дат.
int interval = [date1 compare:date2];
if (interval == 1)
{
NSLog(@"Right hand side date is earlier");
}
else if (interval == -1)
{
NSLog(@"Left hand side date is earlier");
}
else
{
NSLog(@"Both Dates are equal");
}
Вы можете использовать этот метод, но убедитесь, что ваши date1 и date2 являются объектами NSDate, и после их сравнения вы можете использовать метод пузырьковой сортировки вместе с ним для сортировки массива.
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSLocale *currentLocale = [NSLocale currentLocale];
NSArray *sortArray = [iArray sortedArrayUsingComparator:^(id string1, id string2) {
NSRange string1Range = NSMakeRange(0, [string1 length]);
//if([string2 isEqualToString:@"#"])
//return -1;
return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
}];
return sortArray;