如何在NSSet
/NSMutableSet
中根据对象的属性对对象进行高效排序?目前我的做法是遍历每个对象,将它们添加到NSMutableArray
中,并使用NSSortDescriptor
对该数组进行排序。
如何在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];
对于 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];
sortedArrayUsingFunction:context:
的文档确实说该函数应该接受两个 id
和一个 void *
,并返回一个 NSInteger
。至少在这方面,示例是正确的。(他们似乎也更新了它,现在看起来好多了。) - Peter Hosey你不能对 NSSet 进行排序,因为 "sortedArrayUsingFunction:" 方法返回的是 NSArray 类型的结果... 而且所有的上述提示都只适用于 Array :)
NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];
工作得很完美,不需要其他方法 :)
自从OS X 10.7和iOS 5.0以来,就有了NSOrderedSet
。您可以使用它来保留集合中的对象并保持它们的顺序。NSMutableOrderedSet
具有排序方法。在某些情况下,这可能会提高性能,因为您不必像NSArray
一样创建单独的对象来存储排序后的项目。
[mySet sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]];
- micnguyen