【问题标题】:Sorting an NSArray of NSString对 NSString 的 NSArray 进行排序
【发布时间】:2011-06-01 07:41:29
【问题描述】:

谁能告诉我排序 NSMutableArray 的代码?我有以下 NSMutableArray:

NSMutableArray *arr = [[NSMutableArray alloc] init];

带有“2”、“4”、“5”、“1”、“9”等元素,都是NSString。

我想按降序对列表进行排序,以便最大值整数在列表中最高(索引 0)。

我尝试了以下方法:

[arr sortUsingSelector:@selector(compare:)];

但它似乎没有正确排序我的值。

有人可以向我展示正确执行我想要完成的工作的代码吗?谢谢!

【问题讨论】:

    标签: iphone sorting ios nsmutablearray nsarray


    【解决方案1】:

    你应该使用这个方法:

    [arr sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
    

    NSArray 或:

    [arr sortUsingSelector:@selector(caseInsensitiveCompare:)];
    

    在“就地”排序NSMutableArray

    比较器应该返回以下值之一:

    • NSOrderedAscending
    • NSOrderedDescending
    • NSOrderedSame

    【讨论】:

    • 我尝试了第二种方法,这是排序数组的输出:
    • 2、2、2、2、3、3、32、4、47、477、56、7、8
    • 您需要替换示例中给出的比较器,我不知道您在排序“标准”:)
    【解决方案2】:

    编写自己的字符串比较方法非常简单:

    @implementation NSString(compare)
    
    -(NSComparisonResult)compareNumberStrings:(NSString *)str {
        NSNumber * me = [NSNumber numberWithInt:[self intValue]];
        NSNumber * you = [NSNumber numberWithInt:[str intValue]];
    
        return [you compare:me];
    }
    
    @end
    

    【讨论】:

      【解决方案3】:

      如果数组的元素只是带有数字且没有字母的 NSStrings(即“8”、“25”、“3”等),那么这里有一个简洁而有效的方法:

      NSArray *sortedArray = [unorderedArray sortedArrayUsingComparator:^(id a, id b) {
          return [a compare:b options:NSNumericSearch];
      }];
      

      完成!不用写一个完整的方法返回NSComparisonResult,或者八行NSSortDescriptor...

      【讨论】:

      • 你需要将a&b声明为id否则Xcode会报错:[unorderedArray sortedArrayUsingComparator:^(id a, id b) {...}];
      • 它也适用于包含非数字的字符串,例如“文件 1”、“文件 2”等 - 然后它将正确地将“文件 2”排在“文件 12”之前。
      【解决方案4】:

      恕我直言,对此类数组进行排序的最简单方法是

      [arr sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self.intValue" ascending:YES]]]
      

      如果您的数组包含浮点值,只需将键更改为 self.floatValueself.doubleValue

      【讨论】:

        【解决方案5】:

        最简单的方法是制作一个像这样的比较器方法

        NSArray *sortedStrings = [stringsArray sortedArrayUsingComparator:^NSComparisonResult(NSString *firstString, NSString *secondString) {
            return [[firstString lowercaseString] compare:[secondString lowercaseString]];
        }];
        

        【讨论】:

        • 当字符串中有数字(如问题)时,这将无济于事
        猜你喜欢
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 2011-03-25
        • 2013-03-15
        相关资源
        最近更新 更多