为NSSet排序包装器

时间:2012-01-07 14:02:23

标签: objective-c ios cocoa

我需要从UITableView数据源填充NSSet。显然我希望按一些标准对表格进行排序。

我可以使用NSArray创建一个已排序的[mySet sortedArrayUsing...],并将其用于我的表数据源。但是我需要更强大的功能:基础NSSetmySet)会随着时间的推移而发生变化,我希望UITableView能够相应地更新(当然仍然排序)。

目前我最好的选择是将观察者附加到NSSet,并在每次NSArray更改时刷新UITableViewNSSet。它涉及相当多的代码,但效率不高。

所以我想拥有的是这样的东西,我想:

NSArray* sortedWrapperArray = [SortedWrapper wrapperFor:mySet sortUsing:sortCriteria];

当基础集发生变化时,sortedWrapperArray会自动更新。

在Objective-C / Cocoa世界中是否存在类似或相似的内容?

2 个答案:

答案 0 :(得分:3)

如果您的基础集合是NSSet,则每次设置更改时,您都将被迫从头开始对其进行排序,花费O(N*Log(N))时间进行此操作。我认为处理问题的一种更有效的方法是将NSSet替换为NSMutableArray,并通过插入对其进行排序。添加和删​​除已排序数组中的元素仍为O(N):虽然您可以使用二分查找找到位置(请参阅indexOfObject:inSortedRange:options:usingComparator:方法),但插入/删除通常为O(N)(带有虽然非常低的常数。维护集合的唯一性属性也很容易:如果二进制搜索找到您要插入的相同元素,则只需跳过插入即可。相同值检查需要O(Log(N))

答案 1 :(得分:1)

如果您的应用仅在iOS 5.0或更高版本上运行,则可以使用NSOrderedSet