我的 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数组的索引。