使用sortUsingComparator对NSInteger进行排序

时间:2012-08-14 00:02:36

标签: objective-c ios cocoa-touch nsinteger

我正在尝试对NSObjects(一个对象属于一个类)的数组进行排序。对象类有几个变量,我想用它来排序数组中的对象,我用来排序的变量是NSStringNSInteger类型,我相信我正在排序{{ 1}}但是对于这个问题,我希望得到帮助来排序NSString

这是我用来对对象数组进行排序的方法,它接收NSInteger个对象

NSMutableArray

我不确定如何比较NSInteger,我已经读过我可以减去自身的每个数字..如果数字为0则它们相等或+1 / -1等它们不是......但不确定如果这是解决这个问题的最好方法。

任何帮助将不胜感激。

4 个答案:

答案 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不是对象。它只是一个整数(intlong)。因此,您可以准确地比较它们如何比较两个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];
    }
}