什么是在对象进行排序的最有效方式NSSet
/ NSMutableSet
基于集中的对象的属性? 现在我做的方式是通过每个迭代的对象,将它们添加到NSMutableArray
,和排序与阵列NSSortDescriptor
。
Answer 1:
尝试使用
[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];
编辑 :对于iOS 4.0≥和Mac OS X 10.6≥你可以直接使用
[mySet sortedArrayUsingDescriptors:descriptors];
Answer 2:
“最有效的方式”进行排序一组对象的变化的基础上你实际上意味着。 休闲的假设(这之前的答案让)是一次性的排序中的一组对象。 在这种情况下,我会说这是几乎什么之间@cobbal建议和你来干什么了胜负难料-可能像下面这样:
NSMutableArray* array = [NSMutableArray arrayWithCapacity:[set count]];
for (id anObject in set)
[array addObject:anObject];
[array sortUsingDescriptors:descriptors];
(我说这是一个胜负难料,因为@ cobbal的方法创建了两个自动释放的阵列,所以内存占用双打,这是无关紧要的小套的对象,但在技术上,这两种方法都不是非常有效的。)
但是 ,如果你在排序集合中的元素不止一次(尤其是如果它是一个经常的事情),这绝对不是一种有效的方法。 每一次,但即使该数组已经排序它仍然需要N个比较:你可以保持一个NSMutableArray四周,使之与NSSet中同步,然后调用-sortUsingDescriptors。
可可本身就是不为有序保持集合提供了一种有效的方法。 Java有一个TreeSet中 ,其保持每当对象被插入或移除以排序的顺序的元素类,但可可没有。 正是这个问题把我开发我自己用的类似的东西。
作为数据结构框架我继承和革新的一部分,我创建了一个协议和用于排序集合了几个实现 。 任何具体的子类将保持一组排序顺序不同的对象。 还有改进以进行 - 最重要的是它各种基于-compare的结果:(该组中的每个对象必须实现),并且未接受NSSortDescriptor。 (一种解决方法是实施-compare:要比较的对象感兴趣的性质)
一个可能的缺点是,这些类是(目前)不是NS的子类(可变)设定,所以如果你必须通过一个NSSet中,它不会被订购。 (该协议确实有它返回一个NSSet中,这当然是无序的-set方法。)我计划很快纠正,正如我已经与框架中的NSMutableDictionary子类来完成。 反馈是绝对欢迎的。 :-)
Answer 3:
对于iOS 5.0≥和Mac OS X 10.7≥你可以直接使用NSOrderedSet
Answer 4:
的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];
Answer 5:
你不能排序的NSSet,因为“sortedArrayUsingFunction:”设置结果作为NSArray的......而只有数组中的所有上提示工作:)
NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];
工作完美,不需要其他的方式:)
Answer 6:
由于OS X 10.7和iOS 5.0有NSOrderedSet
。 你可以用它来保持对象集,并保持它们的顺序。 NSMutableOrderedSet
有排序方法。 在某些情况下,这可能会提高性能,因为你不必创建单独的物体,像NSArray
存储排序项。