我在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
对它们进行排序答案 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];
}];