2012-02-17 21 views
1

所有,詞典按鍵排序選項 - 阿爾法那麼數字

我想排序數組鍵的這種可變的字典像這樣:A-Z 0-9,但它回來整理0-9 A-Z。我怎樣才能對它進行排序,使字母字符在數字之前出現?也許有一個內置的方法來做到這一點,或者我應該創建一個擴展NSString的類別?

NSArray *sKeysArray = [[listContent allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
    NSString *sectionKey = [sKeysArray objectAtIndex:section]; 
    NSArray *sectionValues = [listContent valueForKey:sectionKey]; 

回答

4

可悲的是有一個在NSString沒有方法將直接做到這一點。而不是寫一個類的,我只想用NSArray小號sortedArrayUsingComparator:方法:

NSArray *sKeysArray = [[listContent ALlKeys] sortedArrayUsingComparator:^(id obj1, id obj2) { 
// Code to compare obj1 and obj2 and return an NSComparisonResult here; return NSOrderedAscending if obj1 should come before obj2 
}]; 

各做比較,我會用NSString– enumerateSubstringsInRange:options:usingBlock:傳遞NSStringEnumerationByComposedCharacterSequences對於選擇(基本枚舉字符,除了它是Unicode字符序列實際上一個「字母」被組合)。當你比較兩個字符時,使用類似於這個question的答案來檢測何時obj1是一個數字,而obj2是常規字母並返回NSOrderedDescending,否則僅使用常規compare:

2

就像@yuri說的,sortedArrayUsingComparator:應該提供基本功能。

下面是一個簡單的版本的排序與字母開頭的字符串後,用十進制數字開頭的字符串(在NSCharacterSet的定義),和葉弦的所有其他組合爲它們的默認排序順序:

NSArray *arr = [NSArray arrayWithObjects: 
       @"ABC 09 GHJ", @"DEF23PO", @"123ABC", @"MCMLXV", @"[cocoa]", @"$2000", @"ERT", @"24seven", @"zero", 
       @"Ångström", @"Übernacht", 
       nil]; 

NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet]; 
NSCharacterSet *alphanums = [NSCharacterSet alphanumericCharacterSet]; 

NSArray *sorted = [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 

    if ([obj1 isKindOfClass:[NSString class]] && [obj1 length] > 0 
     && [obj2 isKindOfClass:[NSString class]] && [obj2 length] > 0) { 

     unichar c1 = [obj1 characterAtIndex:0]; 
     unichar c2 = [obj2 characterAtIndex:0]; 

     if ([digits characterIsMember:c1] && (![digits characterIsMember:c2] && [alphanums characterIsMember:c2])) { 
      return NSOrderedDescending; 
     } 

     if ([digits characterIsMember:c2] && (![digits characterIsMember:c1] && [alphanums characterIsMember:c1])) { 
      return NSOrderedAscending; 
     } 
    } 

    return [obj1 compare: obj2]; 
}]; 

NSLog(@"Sorted: %@", sorted); 

警告:它不會處理由十進制數字組成的unicode字母作爲正確的第一個組件,但我會認爲這是一個病態的情況,直到有人能夠啓發我。