簡體   English   中英

排序NSSet的最有效方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM