SortedArrayUsingComparator无法正常工作

时间:2013-05-15 14:45:38

标签: objective-c sorting nsarray nsnumber

我正在尝试对数组进行排序,但似乎无法可靠地运行。

以下是排序代码。基本上,Request priorityID的值为1-5 例如: enter image description here

 sortedArray = [self.selectedReqArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
            NSLog(@"Value A: %@", [NSNumber numberWithInteger:[(Request*)a priorityID]]);
            NSLog(@"Value B %@", [NSNumber numberWithInteger:[(Request*)b priorityID]]);
            NSNumber *first = [NSNumber numberWithInt:[(Request*)a priorityID]];
            NSNumber *second = [NSNumber numberWithInt:[(Request*)b priorityID]];
            return [first compare:second];
        }];

        self.sortedReqArray = [NSMutableArray arrayWithArray:sortedArray];

有时它正确地排序1-5,但有时它排序1 2 4 5 3 ......

然后,当我去看看NSLog时,当它们应该是1-5时,它会吐出非常大的值。

这是示例输出 Value B 168492640 Value A: 168492640 Value B 168492640 Value A: 174580912 Value B 168492640 Value A: 174580912 Value B 168492640 Value A: 174580912 Value B 168492640 Value A: 174580912 Value B 168492640 Value A: 174580912

发生了什么事?谢谢!

1 个答案:

答案 0 :(得分:3)

从调试器显示[(Request*)a priorityID]似乎是NSNumber,但是 您将其视为整数(因此您实际上是在比较对象的地址)。

以下内容应该有效:

sortedArray = [self.selectedReqArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
            NSNumber *first = [(Request*)a priorityID];
            NSNumber *second = [(Request*)b priorityID];
            return [first compare:second];
        }];

写这个可能稍微更优雅的方式是

sortedArray = [self.selectedReqArray sortedArrayUsingComparator:^NSComparisonResult(Request* a, Request* b) {
            NSNumber *first = [a priorityID];
            NSNumber *second = [b priorityID];
            return [first compare:second];
        }];

如果Request类符合键priorityID的键值编码,则为。{ 以下也应该有效:

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"priorityID" ascending:YES];
sortedArray = [self.selectedReqArray sortedArrayUsingDescriptors:@[sort]];