如何使用NSPredicate以与完整集NSArray相同的顺序对NSSet子集进行排序?

时间:2014-02-03 17:48:34

标签: ios objective-c sorting nspredicate

我的self.allArray包含我的所有对象。然后self.enabledSet包含这些对象的子集。

创建sortedEnabledArray我目前正在执行此操作:

NSArray* enabledArray = [self.enabledSet allObjects];
NSArray* sortedEnabledArray;

sortedEnabledArray = [enabledArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b)
{
    int indexA = [self.allArray indexOfObject:a];
    int indexB = [self.allArray indexOfObject:b];

    if (indexA < indexB)
    {
        return NSOrderedAscending;
    }
    else if (indexA > indexB)
    {
        return NSOrderedDescending;
    }
    else
    {
        return NSOrderedSame;
    }
}];

但我想知道这是否不能以更智能/更短的方式完成,例如使用NSPredicate。有什么想法吗?

编辑: 缩短的一个想法是:

    int difference = indexA - indexB;

    // Convert difference to NSOrderedAscending (-1), NSOrderedSame (0), or NSOrderedDescending (1).
    return (difference != 0) ? (difference / abs(difference)) : 0;

3 个答案:

答案 0 :(得分:4)

这取决于您的集合和数组中的项目数,但您可以这样做:

NSPredicate* predicate = [NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary* bindings)
{
    return [self.enabledSet containsObject:object];
}];

NSArray* sortedEnabledArray = [self.allArray filteredArrayUsingPredicate:predicate];

答案 1 :(得分:3)

我的建议是采用不同的方法。 NSArray有一个名为NSIndexSet的伴侣(它是可变的对应物,NSMutableIndexSet)。它是一个专门用于跟踪满足给定标准的数组子集的对象。

NSArray包含像indicesOfObjectsPassingTest(以及包含其他参数的其他变体)之类的方法,可以将数组的某些成员的索引添加到索引集。

一旦有了表示allArray子集的索引集,就可以使用objectsAtIndexes之类的方法来获取所选对象的数组。

答案 2 :(得分:2)

存储在NSSet中不是对象,而是来自allArray数组的索引。