2012-02-09 38 views
2

我有一个字典数组。 各词典是这样iPhone - 按CGRect的起源对字典数组进行排序。x

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

如何排序myRect.origin.x该阵列?

我知道objective-c有一些聪明的方法来排序字典数组。我的问题在于,我想按照myRect的x坐标进行排序,并且myRect被封装在一个NSValue中......用魔术命令来做到这一点的任何方式?我知道你们是魔术师! :D

谢谢。

回答

8

的干净的方法可能是使用像sortUsingComparator:sortedArrayUsingComparator(取决于阵列的可变性)的方法和定义自定义比较器(一个块以两个参数并返回一个NSComparisonResult),该解包您rects并比较它们的x坐标 - 。

编辑:好吧,既然大家都在提供代码,这里是我的:

[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    CGRect rect1 = [[obj1 valueForKey:@"rect"] CGRectValue]; 
    CGRect rect2 = [[obj2 valueForKey:@"rect"] CGRectValue]; 

    if(rect1.origin.x < rect2.origin.x) { 
     return NSOrderedAscending; 
    } else if(rect1.origin.x > rect2.origin.x) { 
     return NSOrderedDescending; 
    } else { 
     return NSOrderedSame; 
    } 
}]; 
+1

YESSSSSSSSSSSSSS!我知道你们是魔术师!!!!!谢谢! – SpaceDog 2012-02-09 02:23:00

3

没有什么神奇的,但它不是免费的,无论是。 :)你正在寻找-[NSArray sortedArrayUsingComparator:]。如果您的阵列是NSMutableArray,那么您可以使用-[NSMutableArray sortUsingComparator:]

比较器是一个返回NSComparisonResult并取两个对象的块。下面是NSObjCRuntime.h定义:

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

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

伪代码,假设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; 
}]; 
+0

谢谢!!!!!!!!!!!! – SpaceDog 2012-02-09 02:23:49

1

这应该这样做(这并不完全是一个班轮恐怕):

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