我正在尝试对NSObjects
(一个对象属于一个类)的数组进行排序。对象类有几个变量,我想用它来排序数组中的对象,我用来排序的变量是NSString
或NSInteger
类型,我相信我正在排序{{ 1}}但是对于这个问题,我希望得到帮助来排序NSString
。
这是我用来对对象数组进行排序的方法,它接收NSInteger
个对象
NSMutableArray
我不确定如何比较NSInteger,我已经读过我可以减去自身的每个数字..如果数字为0则它们相等或+1 / -1等它们不是......但不确定如果这是解决这个问题的最好方法。
任何帮助将不胜感激。
答案 0 :(得分:17)
[unsortedArray sortUsingComparator:^ NSComparisonResult(SearchResultItem *d1, SearchResultItem *d2) {
NSInteger doorID1 = d1.doorID;
NSInteger doorID2 = d2.doorID;
if (doorID1 < doorID2)
return NSOrderedAscending;
if (doorID1 > doorID2)
return NSOrderedDescending;
return [d1.handel localizedCompare: d2.handel];
}];
因为[aString localizedCompare:anotherString]
将返回NSOrdered(升序|降序|相同),您只需返回字符串大小写的结果。
答案 1 :(得分:2)
NSInteger
不是对象。它只是一个整数(int
或long
)。因此,您可以准确地比较它们如何比较两个int
。
经典C比较函数允许您执行x - y
技巧,但这不适合,因为您将返回一个不适合NSComparisonResult
枚举的整数。因此,您可能只需要执行类似
if (DoorID1 == DoorID2) {
// compare secondary attribute
NSString *handel1 = d1.handel;
NSString *handel2 = d2.handel;
return [handel1 localizedCompare:handel2];
}
else if (DoorID1 < DoorID2) return NSOrderedAscending;
else return NSOrderedDescending;
顺便提一下,您的排序标准可以用NSSortDescriptor
代替,这可能更清晰。
- (NSMutableArray *)startSortingTheArray:(NSMutableArray *)unsortedArray {
NSSortDescriptor *primary = [NSSortDescriptor sortDescriptorWithKey:@"doorID" ascending:YES];
NSSortDescriptor *secondary = [NSSortDescriptor sortDescriptorWithKey:@"handel" ascending:YES selector:@selector(localizedCompare:)];
[unsortedArray sortUsingDescriptors:@[primary, secondary]];
}
答案 2 :(得分:2)
另一种选择:
NSComparisionResult res = [@(d1.doorID) compare:@(d2.doorID)];
return res == NSOrderedSame ? [d1.handel localizedCompare: d2.handel] : res;
答案 3 :(得分:1)
[unsortedArray sortUsingComparator:^ NSComparisonResult(SearchResultItem *d1, SearchResultItem *d2) {
NSInteger doorID1 = d1.doorID;
NSInteger doorID2 = d2.doorID;
if (doorID1 > doorID2)
return NSOrderedAscending;
if (doorID1 < doorID2)
return NSOrderedDescending;
if (doorID1==doorID2) {
NSString *s1=d1.someString;
NSString *s2=d2.someString;
return [s1 compare:s2];
}
}