15

我有一个解析为数组的 NSDictionary,其中一个元素是日期,我尝试使用[startimeArray sortUsingSelector:@selector(compare:)];(starttimeArray) 是我的日期,但它只排列升序。我怎样才能按降序排序。谢谢

4

6 回答 6

38

通过输入NO是升序参数对数组进行排序:

NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[dateArray sortedArrayUsingDescriptors:descriptors];
于 2013-01-26T20:53:43.473 回答
20

您可以使用比较器块

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
    return [d1 compare:d2];
}];

要颠倒顺序,只需交换日期

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
    return [d2 compare:d1];
}];

或者 — 作为compare:返回一个 NSComparisonResult,它实际上是 typedef 为整数,见下文— 只需乘以 -1

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
    return -1* [d1 compare:d2];
}];

enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
于 2013-01-26T21:10:44.077 回答
2

我会使用内置reverseObjectEnumerator方法NSArray

startimeArray = [startimeArray sortUsingSelector:@selector(compare:)];
startimeArray = [[startimeArray reverseObjectEnumerator] allObjects];

当您需要按升序和降序对数组进行排序时,它很有用,因此您可以轻松地返回到先前的排序。

于 2015-01-19T11:36:46.497 回答
1

检查解决方案有快速解决方案:

let sortedArray = randomArray.sortedArrayUsingComparator { (d1, d2) -> NSComparisonResult in
    return (d1 as! NSDate).compare(d2 as! NSDate)
}
于 2016-02-08T16:01:27.003 回答
1

斯威夫特 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))
    })

上面的代码是我的一个项目的片段。它使用辅助类将我的日志与数组左侧的最新日期进行排序。$ 符号是一个位置参数

于 2017-05-17T14:29:01.977 回答
0

在初始化数组元素的类中。

-(NSComparisonResult) compareArray: (id) element {
    Return [ArrayElement compare: [element ArrayElement]];
}



-(NSComparisonResult) compareArrayReverse: (id) element {
    Return [[element ArrayElement] compare: ArrayElement];
}

然后在初始化 starttimeArray 的类中:

@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];
于 2016-07-12T02:20:39.920 回答