Ios 字典键排序选项-字母,然后是数字

Ios 字典键排序选项-字母,然后是数字,ios,cocoa-touch,sorting,nsmutabledictionary,Ios,Cocoa Touch,Sorting,Nsmutabledictionary,全部, 我想对数组键的可变字典进行如下排序:A-z0-9,但它将按0-9a-Z排序。我如何对它进行排序,使alpha字符位于数字之前?也许有一个内置的方法可以做到这一点,或者我应该创建一个扩展NSString的类别 NSArray *sKeysArray = [[listContent allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; NSString *sectionKey = [sKe

全部,

我想对数组键的可变字典进行如下排序:A-z0-9,但它将按0-9a-Z排序。我如何对它进行排序,使alpha字符位于数字之前?也许有一个内置的方法可以做到这一点,或者我应该创建一个扩展NSString的类别

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

遗憾的是,
NSString
中没有直接执行此操作的方法。我不会编写类别,而是使用
NSArray
s
sortedarray使用comparator:
方法:

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
–EnumerateSubstringsRange:options:usingBlock:
传递
NSStringEnumerationByComposedCharacterSequences
作为选项(基本上是枚举字符,但实际上是一个“字母”的unicode字符序列是组合的)。在比较两个字符时,使用类似于此的答案来检测obj1是数字,obj2是普通字母,并返回
sensorddescending
,否则只需使用regular
compare:

很遗憾,
NSString
中没有直接执行此操作的方法。我不会编写类别,而是使用
NSArray
s
sortedarray使用comparator:
方法:

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
–EnumerateSubstringsRange:options:usingBlock:
传递
NSStringEnumerationByComposedCharacterSequences
作为选项(基本上是枚举字符,但实际上是一个“字母”的unicode字符序列是组合的)。当您比较两个字符时,使用类似于此的答案来检测obj1是数字,obj2是普通字母,并返回
sensorderescending
,否则只需使用常规
compare:
就像@yuri所说的那样,
sortedarrayingcomparator:
应该提供基本功能

下面是一个简单的版本,它将以十进制数字开头的字符串排序到以字母字符开头的字符串之后(在
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字母作为第一个组件,但我会认为这是一个病态的案例,直到有人能启发我。

< P>就像@尤里所说,<代码> SoTyDrayRuxSimult::应该提供基本功能。 下面是一个简单的版本,它将以十进制数字开头的字符串排序到以字母字符开头的字符串之后(在
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字母作为第一个分量,但我会认为这是一个病态的情况,直到有人能启发我。< /P>