我有一系列词典。 每个字典都是这样的
object, @"myObject",
[NSValue valueWithCGRect:myRect], @"rect",
nil
如何通过myRect.origin.x对该数组进行排序?
我知道objective-c有智能的方法来排序字典数组。我的问题在于我想按myRect的x坐标排序,myRect包含在NSValue中...用魔法命令做任何事情吗?我知道你们是魔术师! :d
感谢。
答案 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;
}];