Как отсортировать массив дат в порядке убывания
У меня есть NSDictionary, который анализируется на массив, один из элементов - дата, я попытался использовать [startimeArray sortUsingSelector:@selector(compare:)];
(starttimeArray), это моя дата, но она только упорядочивает по возрастанию. как я могу сортироваться в порядке убывания. спасибо
Ответы
Ответ 1
Сортировка массива путем установки НЕТ возрастающего параметра:
NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[dateArray sortedArrayUsingDescriptors:descriptors];
Ответ 2
Вы можете использовать блок компаратора
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
return [d1 compare:d2];
}];
чтобы изменить порядок, просто замените даты
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
return [d2 compare:d1];
}];
или - as compare:
возвращает NSComparisonResult, который на самом деле typedef'ed для целого см. ниже - просто умножьте на -1
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
return -1* [d1 compare:d2];
}];
enum {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
Ответ 3
Я бы использовал встроенный reverseObjectEnumerator
метод NSArray
startimeArray = [startimeArray sortUsingSelector:@selector(compare:)];
startimeArray = [[startimeArray reverseObjectEnumerator] allObjects];
Это полезно, когда вам нужен массив, отсортированный по возрастанию и убыванию, поэтому вы можете легко вернуться к предыдущему виду.
Ответ 4
Быстрое решение для проверенного решения:
let sortedArray = randomArray.sortedArrayUsingComparator { (d1, d2) -> NSComparisonResult in
return (d1 as! NSDate).compare(d2 as! NSDate)
}
Ответ 5
Swift 3.0
Для тех, кто использует swift 3.0, DateHelper сохранит некоторую головную боль.
filteredLogs.sort(by: {
let firstElement = $0.timeStamp! as Date
let secondElement = $1.timeStamp! as Date
return firstElement.compare(.isEarlier(than: secondElement))
})
Вышеприведенный код является фрагментом одного из моих проектов. Он использует класс-помощник для сортировки моих журналов с самыми последними датами слева от массива. Знак $является позиционным параметром
Ответ 6
В классе, в котором инициализируются элементы массива.
-(NSComparisonResult) compareArray: (id) element {
Return [ArrayElement compare: [element ArrayElement]];
}
-(NSComparisonResult) compareArrayReverse: (id) element {
Return [[element ArrayElement] compare: ArrayElement];
}
Затем в классе, где инициализируется ваш startimeArray:
@synthesize ArrayName;
-(void) sort: (BOOL) sel {
if (sel) {
[ArrayName sortUsingSelector: @selector(compareArray:)];
} else {
[ArrayName sortUsingSelector: @selector(compareArrayReverse:)];
}
}
Затем в main():
// Sort the array. sort = TRUE - ascending order, sort = FALSE - descending order.
[startimeArray sort: FALSE];