无法排序自定义对象数组

时间:2013-08-02 12:59:59

标签: ios objective-c arrays sorting

所以我有一个自定义“元素”对象的数组(嘿持有原子序数,化学符号,原子质量等等),我很难用它们的一个属性对它们进行排序;

以下是代码:

switch (sortDescriptor) {

        case 0: {
            //Sort the array by "ATOMIC NUMBER"
            NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) {
                NSNumber *first = @([(SAMElement *)a atomicNumber]);
                NSNumber *second = @([(SAMElement *)b atomicNumber]);
                return [first compare:second];
            }];
            self.elementsArray = [sortedArray mutableCopy];
        }

        case 1: {
            //Sort the array by "ELEMENT NAME"
            NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) {
                NSString *first = [(SAMElement *)a elementName];
                NSString *second = [(SAMElement *)b elementName];
                return [first compare:second];
            }];
            self.elementsArray = [sortedArray mutableCopy];
        }
        case 2:{
            NSLog(@"sorting by chemical symbol");
            //Sort the array by "CHEMICAL SYMBOL"
            NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) {
                NSString *first = [(SAMElement *)a  chemichalSymbol];
                NSString *second = [(SAMElement *)b chemichalSymbol];
                return [first compare:second];
            }];
            self.elementsArray = [sortedArray mutableCopy];
        }

        case 3: {
            //Sort the array by "ATOMIC MASS"
            NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) {
                NSNumber *first = [(SAMElement *)a atomicMass];
                NSNumber *second = [(SAMElement *)b atomicMass];
                return [first compare:second];
            }];
            self.elementsArray = [sortedArray mutableCopy];
        }
        default:
            break;
    }

当它排序时,它返回一个完全随机的元素列表。我做错了吗?

2 个答案:

答案 0 :(得分:3)

通过对象的某些属性对对象数组进行排序的最佳方法,使用NSSortDescriptor。在initWithKey中,您可以设置要排序的属性的名称。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"atomicNumber" ascending:NO];   
[self.elementsArray sortUsingDescriptors:@[sortDescriptor]];

在您的情况下,只需在switch语句的每个案例部分中复制上面的代码,然后更改@"elementName"@"chemichalSymbol"的密钥。

您可以将ascending值从NO更改为YES,具体取决于您想要的订单类型。

请告诉我是否有效。

答案 1 :(得分:1)

我没有立即看到这个错误,但你在这里重新发明了轮子。正确的工具是sortedArrayUsingDescriptors:

[self.elementsArray sortedArrayUsingDescriptors:@[ 
                 [NSSortDescriptor alloc] initWithKey:@"atomicNumber"] ascending:YES]
                                                  ]];

尝试一下,看看它是否摆脱了你的bug。如果您收到随机订单,通常表明您的比较者不一致(有时A> B,有时B> A代表相同的A& B)。