什么是排序的NSSet中最有效的方法是什么?(What is the most efficient

2019-06-24 14:05发布

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



文章来源: What is the most efficient way to sort an NSSet?