什么是排序NSSet最有效的方法?
根据集合中对象的属性,在NSSet
/ NSMutableSet
对对象进行排序的最有效方法是什么? 现在我所做的是通过迭代每个对象,将它们添加到NSMutableArray
,并使用NSSortDescriptor
对该数组进行NSSortDescriptor
。
尝试使用
[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];
编辑 :对于iOS≥4.0和Mac OS X≥10.6,您可以直接使用
[mySet sortedArrayUsingDescriptors:descriptors];
对一组对象进行排序的“最有效的方法”根据您的实际意思而有所不同。 偶然的假设(以前的答案是这样的)是一组一次性的对象。 在这种情况下,我会说这几乎是@cobbal暗示的内容和你想出的内容之间的折腾 - 可能类似于以下内容:
NSMutableArray* array = [NSMutableArray arrayWithCapacity:[set count]];
for (id anObject in set)
[array addObject:anObject];
[array sortUsingDescriptors:descriptors];
(我说这是一种折腾,因为@ cobbal的方法创建了两个自动释放阵列,所以内存占用加倍,这对于小对象来说是无关紧要的,但从技术上讲,这两种方法都非常有效。
但是 ,如果您不止一次地对集合中的元素进行排序(特别是如果它是常规事物),这绝对不是一种有效的方法。 你可以保留一个NSMutableArray并保持它与NSSet同步,然后调用-sortUsingDescriptors:每次,但即使数组已经排序,仍然需要N次比较。
可可本身并没有提供一个有效的方法来维护排序顺序的集合。 Java有一个TreeSet类,它在插入或删除对象时按照排序顺序维护元素,但Cocoa没有。 正是这个问题促使我为自己的用途开发类似的东西。
作为我继承和改进的数据结构框架的一部分,我为有序集合创建了一个协议和一些实现。 任何具体的子类都将按排序顺序维护一组不同的对象。 还有一些改进 - 最重要的是它根据-compare :(集合中的每个对象必须实现)的结果进行排序,并且还不接受NSSortDescriptor。 (解决方法是实现-compare:比较对象的兴趣属性。)
一个可能的缺点是这些类(当前)不是NS(可变)集的子类,所以如果您必须通过NSSet,它将不会被排序。 (该协议确实有一个返回NSSet的-set方法,当然这是无序的。)我打算很快纠正这个问题,因为我已经完成了框架中的NSMutableDictionary子类。 反馈肯定是受欢迎的。 :-)
对于NSOrderedSet
和Mac OS NSOrderedSet
您可以直接使用NSOrderedSet