所以这里是层次结构:
NSArray
A 包含 3 个对象。这些自定义对象中的每一个都包含NSSet
另一个自定义对象。这些“另一个自定义对象”中的每一个都包含一个数字。
我想NSArray
按那个数字对 A 进行排序。我不在乎拾取了集合中的什么对象。该集合中的任何对象都可以。
关于如何做到这一点的任何线索NSSortDescriptor
?
所以这里是层次结构:
NSArray
A 包含 3 个对象。这些自定义对象中的每一个都包含NSSet
另一个自定义对象。这些“另一个自定义对象”中的每一个都包含一个数字。
我想NSArray
按那个数字对 A 进行排序。我不在乎拾取了集合中的什么对象。该集合中的任何对象都可以。
关于如何做到这一点的任何线索NSSortDescriptor
?
Key-Value 编码也适用于自定义对象的属性(甚至是实例变量),如下例所示。但是您必须指定一个应用于集合的集合运算符以选择要排序的对象,@max
例如@min
或@avg
。
// The "inner object", containing a number:
@interface Custom1 : NSObject
@property (nonatomic, strong) NSNumber *number;
@end
@implementation Custom1
@end
// The "outer object", containing a set of "inner" objects:
@interface Custom2 : NSObject
@property (nonatomic, strong) NSSet *others; // set of "Custom1 objects.
@end
@implementation Custom2
@end
现在您可以执行以下操作:
Custom1 *o1 = [[Custom1 alloc] init];
o1.number = @1;
Custom1 *o2 = [[Custom1 alloc] init];
o2.number = @2;
Custom2 *p1 = [[Custom2 alloc] init];
p1.others = [NSSet setWithObjects:o1, o2, nil];
Custom1 *o3 = [[Custom1 alloc] init];
o3.number = @3;
Custom1 *o4 = [[Custom1 alloc] init];
o4.number = @4;
Custom2 *p2 = [[Custom2 alloc] init];
p2.others = [NSSet setWithObjects:o3, o4, nil];
NSArray *array = @[p1, p2];
// Sort according to maximum number in the inner object set:
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"others.@max.number" ascending:YES];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:@[sort]];
由于数据存储在NSArray
排序中,因此可以使用块来完成排序,排序描述符称为比较器。请注意,这种方法不适用于 SQLite 支持的核心数据提取,后者直接对存储在基础数据库中的属性值进行排序。
有几种方法可以解决,这个是直截了当的,与行人接壤(我希望我的数据结构是正确的):
NSArray *data = @[
@{@"otherobjects":[NSSet setWithObjects: @{@"num":@2}, @{@"num":@1}, @{@"num":@4}, nil]},
@{@"otherobjects":[NSSet setWithObjects:@{@"num":@7}, @{@"num":@9}, @{@"num":@8}, nil]}
];
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"otherobjects" ascending:NO comparator:^NSComparisonResult(id obj1, id obj2) {
NSNumber *n1 = [[obj1 anyObject] valueForKey:@"num"];
NSNumber *n2 = [[obj2 anyObject] valueForKey:@"num"];
return [n1 compare: n2];
}];
NSArray *sorted = [data sortedArrayUsingDescriptors:@[sd]];
如果你想变得花哨,你可以在你的自定义对象上实现一个比较两个对象的方法,然后使用该方法创建一个排序描述符,或者你可以声明一个只读属性,例如返回最大值或最小值NSSet
,然后简单地对该属性使用正常的排序描述符。