Как отсортировать массив дат в порядке убывания

У меня есть 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];