对包含对象的NSMutableArray进行自定义排序的最佳方法是什么

时间:2014-01-24 09:39:03

标签: objective-c

我在NSMutableArray中看到了很多自定义排序的例子,其中一个是 How to sort an NSMutableArray with custom objects in it?,但我有一个带有a和b的对象,我想按照* b对它们进行排序。

我看到了这段代码

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                              ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

但是我没有生日这里我需要根据* b(两者都是双倍)进行排序?

更多详情,

我有一个包含CGRect对象的NSMutableArray,我想根据width * height

对它们进行排序

3 个答案:

答案 0 :(得分:2)

NSSortDescriptor不适合比比较简单密钥或可能是一组密钥更复杂的东西。

您需要使用自定义比较器(块)进行排序。像

这样的东西
sortedArray = [myArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    MyObject *first = (MyObject*)a;
    MyObject *second = (MyObject*)b;

    if (first.a * first.b < second.a * second.b) {
        return NSOrderedAscending;
    }
    else if (first.a * first.b > second.a * second.b) {
        return NSOrderedDescending;
    }
    return NSOrderedSame;
}]

请注意,就你的(a * b)描述而言,我只是扯着它,不确定你想要的是什么。

答案 1 :(得分:2)

我同意以前的解决方案。您可以将CGRects包装到NSValue中来放入数组:

CGRect rect = CGRectMake(0, 10, 20, 30);
NSValue *valueToPutInArray = [NSValue valueWithCGRect:rect];

并使用这样的块对它们进行排序:

NSArray *sortedArray = [rectArray sortedArrayUsingComparator:^NSComparisonResult(NSValue *rectAValue, NSValue *rectBValue) {
        CGRect rectA = [rectAValue CGRectValue];
        CGRect rectB = [rectBValue CGRectValue];

        CGFloat areaA = rectA.size.width * rectA.size.height;
        CGFloat areaB = rectB.size.width * rectB.size.height;

        if (areaA < areaB)
        {
            return NSOrderedAscending;
        }
        else if (areaB > areaA)
        {
            return NSOrderedDescending;
        }
        else
        {
            return NSOrderedSame;
        }
    }];

另一种解决方案是将CGRect包装到自定义对象中并向其添加一个函数,如

- (CGFloat)area
{
   return self.rect.size.width * self.rect.size.height;
}

(self.rect是包裹的矩形) 如果使用这些自定义对象填充数组,则可以通过创建类似

的排序描述符,使用原始方法对其进行排序
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"area" ascending:YES];

这将简单地比较区域函数的结果并对产生的数组进行排序。

答案 2 :(得分:1)

实施自定义排序的最简单方法是使用-[NSMutableArray sortUsingComparator:-[NSArray sortedArrayUsingComparator:]

sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    // Compare stuff, return a NSComparisonResult.
    return [obj1 compare:obj2];
}];

我喜欢在块中明确传递对象类型BTW。例如,对于字符串:

sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
    // Compare stuff, return a NSComparisonResult.
    return [obj1 localizedCaseInsensitiveCompare:obj2];
}];