【问题标题】:Dictionary Key Sort Options - Alpha then Numeric字典键排序选项 - 字母然后数字
【发布时间】:2012-02-17 12:13:10
【问题描述】:

全部,

我想对这个数组键的可变字典进行排序,如下所示:A-Z 0-9 但它回来排序为 0-9 A-Z。如何对其进行排序,以使 alpha 字符出现在数字之前?也许有一个内置方法可以做到这一点,或者我应该创建一个扩展 NSString 的类别?

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

【问题讨论】:

    标签: ios cocoa-touch sorting nsmutabledictionary


    【解决方案1】:

    遗憾的是,NSString 中没有任何方法可以直接执行此操作。我不会写一个类别,而是使用NSArrays 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 字母作为第一个组件,但我会认为这是一个病态的案例,直到有人能启发我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多