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