![](/img/trans.png)
[英]NSSortDescriptor most effective way to sort Core Data NSSet objects
[英]What is the most efficient way to sort an NSSet?
基於集合中對象的屬性,在NSSet
/ NSMutableSet
對對象進行排序的最有效方法是什么? 現在,我這樣做的方法是迭代每個對象,將它們添加到NSMutableArray
,並使用NSSortDescriptor
對該數組進行NSSortDescriptor
。
嘗試使用
[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];
編輯 :對於iOS≥4.0且Mac OSX≥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次比較。
Cocoa本身並不提供按排序順序維護集合的有效方法。 Java有一個TreeSet類,只要插入或刪除對象,它就按照排序順序維護元素,但Cocoa卻沒有。 正是這個問題促使我為自己開發類似的東西。
作為我繼承和修改的數據結構框架的一部分,我為有序集創建了一個協議和一些實現 。 任何具體的子類都將按排序順序維護一組不同的對象。 仍然需要進行改進 - 最重要的是它根據-compare的結果進行排序:(集合中的每個對象必須實現)並且還不接受NSSortDescriptor。 (解決方法是實現-compare:比較對象上感興趣的屬性。)
一個可能的缺點是這些類(當前)不是NS(Mutable)Set的子類,因此如果必須傳遞NSSet,則不會對它進行排序。 (該協議確實有一個-set方法,它返回一個NSSet,當然是無序的。)我打算很快糾正這個問題,因為我已經完成了框架中的NSMutableDictionary子類。 絕對歡迎反饋。 :-)
對於NSOrderedSet
和Mac NSOrderedSet
您可以直接使用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];
從OS X 10.7和iOS 5.0開始,有NSOrderedSet
。 您可以使用它來保持對象集並保持其順序。 NSMutableOrderedSet
具有排序方法。 在某些情況下,這可能會提高性能,因為您不必創建單獨的對象(如NSArray
來存儲已排序的項目。
你不能對NSSet進行排序,因為“sortedArrayUsingFunction:”將結果設置為NSArray ...並且所有上部提示僅適用於Array :)
NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];
工作完美,而不需要其他方式:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.