2

我在我的字段“日期”上对 NSMutableArray 进行排序,但它没有考虑时间。如果日期相同,时间仍然是随机排序的。我究竟做错了什么?“日期”字段属于 NSDate 类型。

 NSSortDescriptor *dateDescriptor =
[[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
NSArray *descriptors = [NSArray arrayWithObjects:dateDescriptor, nil];

[self.player1ScoreT sortedArrayUsingDescriptors:descriptors];

我的输出是:
2012-11-25 11:01:00 +0000
2012-11-25 11:00:56 +0000
2012-11-25 11:00:54 +0000
2012-11-25 11:01:03 +0000

奇怪的.....

4

2 回答 2

4

您用来排序的逻辑是正确的,我刚刚尝试过,它工作正常。

我认为这是因为[self.player1ScoreT sortedArrayUsingDescriptors:descriptors];,这不会改变保存在 中的数组self.player1ScoreT,而是会产生一个新数组。这是因为您使用的选择器不会改变原始数组(NSArray它本身在设计上是不可变的,NSMutableArray是可变的)。

因此,你会想要使用这个:

self.player1ScoreT = [self.player1ScoreT sortedArrayUsingDescriptors:descriptors];

这会将其中的数组重新分配self.player1ScoreT为由 生成的新排序数组,sortedArrayUsingDescriptors:并且旧的未排序数组将被丢弃。

于 2012-11-25T11:36:25.103 回答
0

正如 WDUK 所说,您缺少 sortedArray 的分配:

id newArray = [oldArray sortedArrayUsing...

我什至试过了,它可以对日期进行排序,包括时间

我试过的代码:

int main(int argc, char *argv[]) {
@autoreleasepool {
    id player1ScoreT = @[@{@"date":[NSDate dateWithTimeIntervalSinceNow:-100]},
                         @{@"date":[NSDate dateWithTimeIntervalSinceNow:-1000]},
                         @{@"date":[NSDate dateWithTimeIntervalSinceReferenceDate:+1000]},
                         @{@"date":[NSDate dateWithTimeIntervalSinceReferenceDate:-50]},
                         @{@"date":[NSDate dateWithTimeIntervalSinceNow:+50]},
                         @{@"date":[NSDate dateWithTimeIntervalSinceNow:+0]}];
    NSLog(@"%@", [player1ScoreT valueForKeyPath:@"date"]);
    player1ScoreT = [player1ScoreT sortedArrayUsingDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES]]];
    NSLog(@"%@", [player1ScoreT valueForKeyPath:@"date"]);
}
}
于 2012-11-25T11:30:59.973 回答