iPhone - 通过CGRect的origin.x对字典数组进行排序

时间:2012-02-09 00:35:34

标签: iphone ios sorting nsarray

我有一系列词典。 每个字典都是这样的

object, @"myObject",
[NSValue valueWithCGRect:myRect], @"rect",
nil

如何通过myRect.origin.x对该数组进行排序?

我知道objective-c有智能的方法来排序字典数组。我的问题在于我想按myRect的x坐标排序,myRect包含在NSValue中...用魔法命令做任何事情吗?我知道你们是魔术师! :d

感谢。

3 个答案:

答案 0 :(得分:8)

最干净的方法可能是使用像sortUsingComparator:sortedArrayUsingComparator这样的方法(取决于数组的可变性)并定义一个自定义比较器(一个块接受两个参数并返回{{1解包你的rects并比较他们的x坐标。

编辑:嗯,因为其他人都在提供代码,所以这是我的:

NSComparisonResult

答案 1 :(得分:3)

没有魔法,但它也不是免费的。 :)你正在寻找-[NSArray sortedArrayUsingComparator:]。如果您的数组是NSMutableArray,那么您可以使用-[NSMutableArray sortUsingComparator:]

比较器是一个返回NSComparisonResult并占用两个对象的块。这是NSObjCRuntime.h中的定义:

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);

块应该获取对象,将它们转换为字典,从每个对象中提取NSValues到rects并返回比较X坐标字段的结果。

Psuedocode,假设NSMutableArray

[myArray sortUsingComparator:^(id obj1, id obj2) {
    NSDictionary *dict1 = (NSDictionary *)obj1;
    NSDictionary *dict2 = (NSDictionary *)obj2;
    // Extract each of the NSValues
    // Compare the x values
    if (xValue1 == xValue2) return NSOrderedSame;
    return (xValue1 < xValue2) ? NSOrderedAscending : NSOrderedDescending;
}];

答案 2 :(得分:1)

这应该这样做(我担心这不是一个单行程):

NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id obj1, id obj2) {
    ([[obj1 objectForKey:@"rect"] CGRectValue].x < [[obj2 objectForKey:@"rect"] CGRectValue].x)? NSOrderedAscending : NSOrderedDescending;
}];