簡體   English   中英

字典鍵排序選項-按字母順序,然后按數字

[英]Dictionary Key Sort Options - Alpha then Numeric

所有,

我想像這樣對數組鍵的可變字典進行排序:AZ 0-9,但它又回來了,排序為0-9 AZ。 如何對字母進行排序,使字母字符位於數字之前? 也許有執行此操作的內置方法,還是應該創建擴展NSString的類別?

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

不幸的是, NSString中沒有直接執行此操作的方法。 除了編寫類別之外,我只使用NSArraysortedArrayUsingComparator:方法:

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字符序列組合在一起)。 並且,當您比較兩個字符時,請使用類似該問題的答案的方法來檢測obj1是數字,而obj2是常規字母,然后返回NSOrderedDescending ,否則只需使用常規compare:

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

這是一個簡單的版本,它以字母字符開頭的字符串(在NSCharacterSet的定義中)對以十進制數字開頭的字符串進行排序,並將所有其他字符串組合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字母作為第一個組成部分,但是在有人可以啟發我之前,我會認為這是一種病理情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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