2016-09-08 40 views
0

在即時假設這是重複的之前,請繼續閱讀。可以使用NSSortComparator對NSMutableOrderedSet <NSString*>進行排序嗎?

我想以高效的方式對大型NSMutableOrderedSet<NSString*>進行排序。

我知道如何使用NSSortComparatorNSMutableOrderedSet<SomeObject*>進行排序,並將密鑰設置爲SomeObject的相關成員。

我也知道如何使用sortedArrayUsingSelector:@selector(compare:)

使用sortUsingComparator:^(id firstObject, id secondObject).

我也知道如何排序的數組,例如,NSNumber排序的SomeObject數組但我想不出是怎麼當項目是天然的OBJ-C的對象,如NSString的,而不是用戶定義的對象進行排序的NSMutableOrderedSet

  • NSortComparator使用密鑰,但是不存在如果設置的內容是NSString而不是自定義對象,那麼鍵?所以這不能用? (我注意到NSSortComparator有一個SEL財產,因此我認爲它可能被設置爲NSString:compare,但它的只讀)。
  • 我發現使用sortUsingComparator很慢(幾秒鐘)排序大型數組(大約50,000個項目),但使用NSSortComparator幾乎可以瞬時排序包含相同類型元素的NSMutableOrderedSet。因此,如果速度較慢,我不想使用sortUsingComparator進行排序。
  • 我看不到NSMutableOrderedSet的方法,如sortedArrayUsingSelector

所以我的問題是我怎麼能以高效的方式排序的集合,如果我不能使用,如果sortDescriptorsortUsingComparitor是慢?

我可以創建一個包含什麼DummyObject而是NSString,並有NSMutableOrderedSet<DummyObject*>,然後使用排序NSSortComparator,但似乎瘋了,所以必須有一個更簡單的方法,但我不能看到從API文檔,也不是什麼也沒有過去的問題

+0

@rmaddy不,它不是。如果例如「xxx」,「aaa」,「ddd」等字符串按照該順序使用addObject添加,然後如果該集合被迭代,則它們與添加時的順序相同。添加一個字符串時,該集不會自動排序。使用setObject:atIndex將確保插入時的排序,但這不是我問題的一部分,我想知道如何在使用addObject之後對它們進行排序。 – Gruntcakes

+0

您應該能夠將'@「self」'作爲關鍵字傳遞給排序描述符。我認爲'nil'也可以。 – dan

+0

@二氧化氯哎呀。瞬間失效。 – rmaddy

回答

1
NSMutableOrderedSet<NSString*> *set = [[NSMutableOrderedSet<NSString*> alloc] init]; 
[set addObject:@"c"]; 
[set addObject:@"b"]; 
[set addObject:@"a"]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES]; 
[set sortUsingDescriptors:@[sortDescriptor] 
相關問題