【问题标题】:Trouble sorting an array of custom objects对自定义对象数组进行排序时遇到问题
【发布时间】:2013-08-02 12:59:58
【问题描述】:

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

代码如下:

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

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

【问题讨论】:

  • 您是否调试过代码来验证“first”和“second”属性的值?
  • 您是否故意在 case 块后遗漏了 break;,以便例如当sortDescriptor==2 数组首先按化学符号排序,然后再按原子质量排序?
  • 任何答案对您有用吗?如果是,请接受一个,以便从未回答中删除您的问题。如果没有,请提供一些新信息反馈。

标签: ios objective-c arrays sorting


【解决方案1】:

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

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

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

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

请告诉我是否有效。

【讨论】:

  • 没错,但这样使用initWithObjects:count: 是不寻常的。您选择这样做的任何原因,而不是更简单的 arrayWithObject:(或者现在当然是文字:@[])。
  • 该语法是因为它使用了对 sortDescriptor 指针的引用,并且一旦它不是 id 对象,就无法使用这些初始化器。但是我现在做了一些研究,并且确实看到了在 sortDescriptor 中没有引用操作数的其他代码。我觉得我的代码有点过时了,我很久以前就找过了,所以我编辑了我的 anwser 以使用新的语法进行更新。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多