使用具有uniqueID的对象对NSMutableArray进行排序

时间:2011-09-14 15:01:20

标签: objective-c nsmutablearray

我浏览了网页,并了解使用NSMutableArraysortUsingSelector:进行排序的方法之一。但我对确切需要做什么仍然有点不稳定。我知道比较器方法应该返回NSOrderedAscendingNSOrderedDescending才能进行排序,但我需要更多的帮助。

我有一个Block对象数组。每个区块的唯一ID范围为1到200+。我想基于Block对象uniqueID对数组进行排序。这可能吗?

NSMutableArray *array = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < 221; i++) {
    Block *block = [[Block alloc] init];
    block.uniqueId = i;
    [array addObject:block];
    [block release];
}

现在,显然这个数组在初始化之后被排序,但我稍后添加和删除Blocks,并且之后想要使用数组。请帮忙!

2 个答案:

答案 0 :(得分:3)

另一种选择是使用排序描述符。它们基于对象内的属性。 你可以在一行中这样做:

NSArray* sorted =[array sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"uniqueId" ascending:YES]]];

或单独创建

NSSortDescriptor* idDescriptor=[NSSortDescriptor sortDescriptorWithKey:@"uniqueID" ascending:YES]
NSArray* descriptors=[NSArray arrayWithObject: idDescriptor];
NSArray* sortedArray=[array sortedArrayUsingDescriptors: descriptors];

使用此选项,您可以通过向描述符数组添加多个NSSortDescriptor来指定多个排序级别。

答案 1 :(得分:1)

NSArray *sortedArray = [array sortedArrayUsingComparator:^(id o1, id o2) {
    int id1 = ((Block *)o1).uniqueId;
    int id2 = ((Block *)o2).uniqueId;

    if (id1 == id2) {
        return NSOrderedSame;
    }
    if (id1 < id2) {
        return NSOrderedAscending;
    }
    return NSOrderedDescending;
}];