所以我有一个自定义“元素”对象的数组(嘿持有原子序数,化学符号,原子质量等等),我很难用它们的一个属性对它们进行排序;
以下是代码:
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;
}
当它排序时,它返回一个完全随机的元素列表。我做错了吗?
答案 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)。