对 NSSet 进行排序最有效的方法是什么?
-
21-08-2019 - |
题
对对象进行排序的最有效方法是什么 NSSet
/NSMutableSet
基于集合中对象的属性?现在我这样做的方法是迭代每个对象,将它们添加到 NSMutableArray
, ,然后对该数组进行排序 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的类保持要素在每当物体被插入或移除,但按排序顺序可可没有。正是这个问题把我开发我自己用的类似的东西。
作为一个数据结构框架我继承和革新的一部分,我创建了一个协议和有序集合了几个实现的。任何具体的子类将保持一组排序顺序不同的对象。还有改进以进行 - 最重要的是它各种基于-compare的结果:(该组中的每个对象必须实现),并且未接受NSSortDescriptor。 (一种解决方法是实施-compare:以比较在对象上感兴趣的性质)
一个可能的缺点是,这些类是(目前)不是NS(可变)设置的子类,所以如果你必须通过一个NSSet中,它不会被订购。 (该协议确实有它返回一个NSSet中,这当然是无序的-set方法。)我计划很快纠正,正如我已经与框架中的NSMutableDictionary子类来完成。反馈是绝对欢迎的。 : - )
有关的iOS≥5.0和Mac OS X≥10.7可以直接使用NSOrderedSet
NSSet 是无序对象的集合。查看苹果参考资料数组是有序集合。
看看 NSArray 有一个关于排序示例的讨论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];
您不能排序的NSSet,因为 “sortedArrayUsingFunction:” 设置结果作为NSArray的... 和所有上暗示仅阵列工作:)
NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];
工作完美的,而不是需要其他方式:)
由于OS X 10.7和iOS 5.0有NSOrderedSet
。你可以用它来保持对象集,并保持它们的顺序。 NSMutableOrderedSet
有排序方法。
在某些情况下,这可能会提高性能,因为你不必创建单独的物体,像NSArray
存储排序项。