0

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

这是代码:

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;
    }

当是排序它返回一个完全随机的元素列表。难道我做错了什么?

4

2 回答 2

3

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

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

在您的情况下,只需在您的 switch 语句的每个 case 部分中复制上面的代码,更改@"elementName"and的键@"chemichalSymbol"

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

请让我知道是否有效。

于 2013-08-02T13:11:13.080 回答
1

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

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

试试看,看看它是否能摆脱你的错误。如果您收到随机订单,这通常表明您的比较器不一致(有时 A>B 有时 B>A 对于相同的 A&B)。

于 2013-08-02T13:11:35.313 回答