当前位置:  开发笔记 > IOS > 正文

排序NSSet的最有效方法是什么?

如何解决《排序NSSet的最有效方法是什么?》经验,为你挑选了3个好方法。

NSSet/ NSMutableSet基于集合中对象的属性对对象进行排序的最有效方法是什么?现在,我这样做的方法是迭代每个对象,将它们添加到a中NSMutableArray,然后对该数组进行排序NSSortDescriptor.



1> cobbal..:

尝试使用

[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];

编辑:对于iOS≥4.0且Mac OSX≥10.6,您可以直接使用

[mySet sortedArrayUsingDescriptors:descriptors];


这与提问者的建议没什么不同,并且可能大致等同于--allObjects返回自动释放的NSArray,而-sortedArrayUsingDescriptors:返回一个单独的NSArray(两者都是不可变的).分配两个数组的成本并不比枚举(中等大小)集合中的所有元素少得多,并且需要两倍的空间.

2> Quinn Taylor..:

对一组对象进行排序的"最有效方法"因实际意义而异.随意的假设(前面的答案所做的)是一组中的一次性对象.在这种情况下,我会说@cobbal建议和你想出的东西之间几乎是一个折腾- 可能类似于以下内容:

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

(我说这是一个折腾,因为@ cobbal的方法会创建两个自动释放的数组,因此内存占用量增加一倍.这对于小型对象来说无关紧要,但从技术上讲,这两种方法都不是很有效.)

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

Cocoa本身并不提供按排序顺序维护集合的有效方法.Java有一个TreeSet类,只要插入或删除对象,它就按照排序顺序维护元素,但Cocoa却没有.正是这个问题促使我为自己开发类似的东西.

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

一个可能的缺点是这些类(当前)不是NS(Mutable)Set的子类,因此如果必须传递NSSet,则不会对它进行排序.(该协议确实有一个-set方法,它返回一个NSSet,当然是无序的.)我打算很快纠正这个问题,因为我已经完成了框架中的NSMutableDictionary子类.绝对欢迎反馈.:-)



3> bioffe..:

对于iOS≥5.0和Mac OSX≥10.7,您可以直接使用 NSOrderedSet

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有