如何使用NSPREDICATE按与完整集NSarray相同的顺序排序NSSET子集



我的 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;

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

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

我的建议是使用其他方法。Nsarray有一个称为NSINDEXSET的伴侣(它是可变的对应物,NsmutableIndexset)。它是一个专门旨在跟踪符合给定标准的数组子集的对象。

nsArray包括诸如indexesofobjectspassingtest之类的方法(以及包含其他参数的其他变体。)让您将数组的某些成员添加到索引集中。

拥有代表Allarray子集的索引集后,您可以使用objectSatIndexes之类的方法来获取所选对象的数组。

存储在nsset不是对象中,而是索引添加了allarray数组的索引。

最新更新