对对象进行排序的最有效方法是什么 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存储排序项。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top