什么是sortingNSSet最有效的方法?

根据集合中对象的属性,在NSSet / NSMutableSetsorting对象的最有效方法是什么? 现在我正在做的方式是遍历每个对象,将它们添加到一个NSMutableArray ,并用NSSortDescriptorsorting该数组。

尝试使用

 [[mySet allObjects] sortedArrayUsingDescriptors:descriptors]; 

编辑 :对于iOS≥4.0和Mac OS X≥10.6,可以直接使用

 [mySet sortedArrayUsingDescriptors:descriptors]; 

对一组对象进行sorting的“最有效的方法”根据您的实际意思而有所不同。 偶然的假设(以前的答案是这样的)是一组一次性的对象。 在这种情况下,我会说这是@cobbalbuild议和你想出的东西之间的折腾 – 可能类似于以下内容:

 NSMutableArray* array = [NSMutableArray arrayWithCapacity:[set count]]; for (id anObject in set) [array addObject:anObject]; [array sortUsingDescriptors:descriptors]; 

(我认为这是一种折腾,因为@ cobbal的方法创build了两个自动释放的数组,所以内存占用加倍,这对于小对象是无关紧要的,但从技术上讲,这两种方法都不是非常有效。

但是 ,如果你不止一次地对集合中的元素进行sorting(特别是如果它是一个常规的东西),这绝对不是一个有效的方法。 你可以保留一个NSMutableArray,并保持它与NSSet同步,然后调用-sortUsingDescriptors:每次,但即使数组已经sorting,仍然需要N次比较。

cocoa本身并没有提供一个有效的方法来保持sorting的集合。 Java有一个TreeSet类,每当一个对象被插入或删除时,它就按sorting顺序维护这些元素,但Cocoa没有。 正是这个问题促使我开发了一些类似的东西供我自己使用。

作为我inheritance和改进的数据结构框架的一部分,我创build了一个协议,并为有序集合创build了一些实现 。 任何具体的子类都将按sorting顺序维护一组不同的对象。 还有一些改进 – 最重要的是根据-compare:(该集合中的每个对象必须实现)的结果进行sorting,并且还不接受NSSortDescriptor。 (解决方法是实现-compare:比较对象的兴趣属性。)

一个可能的缺点是,这些类(当前)不是NS(可变)集的子类,所以如果您必须通过NSSet,它将不会被sorting。 (协议确实有一个返回NSSet的-set方法,当然这是无序的。)我打算很快纠正这个问题,就像我在框架中使用NSMutableDictionary子类一样。 反馈肯定是受欢迎的。 🙂

对于NSOrderedSet和Mac OS NSOrderedSet您可以直接使用NSOrderedSet

NSSet是无序对象的集合。 看看苹果引用数组是有序的集合。

看看NSArray有一个讨论与sorting的例子http://developer.apple.com/documentation/Cocoa/Conceptual/Collections/Articles/sortingFilteringArrays

链接示例:

 NSInteger alphabeticSort(id string1, id string2, void *reverse) { if (*(BOOL *)reverse == YES) { return [string2 localizedCaseInsensitiveCompare:string1]; } return [string1 localizedCaseInsensitiveCompare:string2]; } 

 // assuming anArray is array of unsorted strings NSArray *sortedArray; // sort using a selector sortedArray = [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; // sort using a function BOOL reverseSort = NO; sortedArray = [anArray sortedArrayUsingFunction:alphabeticSort context:&reverseSort]; 

你不能sortingNSSet,因为“sortedArrayUsingFunction:”设置结果作为NSArray …和所有上层提示工作只有arrays:)

 NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors]; 

工作完美,而不需要其他方式:)

由于OS X 10.7和iOS 5.0有NSOrderedSet 。 您可以使用它来保持对象的设置并保持其顺序。 NSMutableOrderedSet有sorting的方法。 在某些情况下,这可能会提高性能,因为您不必像NSArray一样创build单独的对象来存储sorting的项目。