【问题标题】:Sort NSMutableArray with strings that contain numbers?使用包含数字的字符串对 NSMutableArray 进行排序?
【发布时间】:2012-06-17 23:37:59
【问题描述】:

我有一个 NSMutableArray,它保存了用户的高分。我想按数字排列项目(数字存储在 NSStrings 中。)
示例:
4,2,7,8

2,4,7,8
什么是如果数据存储在 NSStrings 中,最简单的方法是什么?

【问题讨论】:

  • 你看文档了吗?对于 NSMutableArray?而对于 NSString?而对于 NSComparator?这真的超级简单。
  • 如果这么简单,你能回答而不是抱怨吗?
  • 但是如果他能让你意识到可以在文档中找到很多答案并让你学习如何使用它,那么也许你下次遇到问题时可以看看那里:)
  • 没错...那天我只是感觉不外向。

标签: objective-c sorting nsarray


【解决方案1】:

这段代码可以做到:

//creating mutable array
NSMutableArray *myArray = [NSMutableArray arrayWithObjects:@"4", @"2", @"7", @"8", nil];

//sorting
[myArray sortUsingComparator:^NSComparisonResult(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:(NSNumericSearch)];
}];

//logging
NSLog(@"%@", myArray);

它使用块,确保您的目标操作系统支持(iOS 为 4.0,OSX 为 10.6)。

【讨论】:

  • 我收到错误Incompatible block pointer types initializing 'int (^)(struct NSString *, struct NSString *)', expected 'NSComparator'
  • @TheDeveloper 我只是将我的代码复制粘贴到 Xcode 中,它编译并运行。你一定是做错了什么。
  • 你用的是ARC吗?我刚刚粘贴并构建,它给了我这个错误。
  • 嗯,我想我得问问 StackOverflow 社区再次
  • @user3123201 比较 str2 和 str1。
【解决方案2】:

此代码有效。我试过了:

NSMutableArray *unsortedHighScores = [[NSMutableArray alloc] initWithObjects:@"4", @"2", @"7", @"8", nil];

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

for(NSString *score in unsortedHighScores){
    
    NSNumber *scoreInt = [NSNumber numberWithInteger:[score integerValue]];
    [intermediaryArray addObject:scoreInt];
}

NSArray *sortedHighScores = [intermediaryArray sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", sortedHighScores);

输出是这样的:

2

4

7

8

如果您对代码有任何疑问,请在 cmets 中提问。希望这会有所帮助!

【讨论】:

  • @TheDeveloper 你是对的。它们是 NSSNumber 对象,但很容易将它们转换回字符串。
【解决方案3】:

NSMutableArray 方法sortUsingSelector: 应该这样做:

[scoreArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]

应该这样做。

【讨论】:

  • 这只会进行字符串比较,效果不好。例如如果你有一个数组,@"10", @"25", @"50", @"51", @"2000" .... 运行比较会给你:@"10", @"2000", @"25"、@"50"、@"51"。可能不是你想要的。 @Adam 的答案是正确的。
【解决方案4】:

如果数组包含包含键 number 的数值的 nsdictionaries

isKeyAscending = isKeyAscending ? NO : YES;

[yourArray sortUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {

    NSString *str1 = [obj1 objectForKey:@"number"];
    NSString *str2 = [obj2 objectForKey:@"number"];

    if(isKeyAscending) { //ascending order
        return [str1 compare:str2 options:(NSNumericSearch)];
    } else { //descending order
        return [str2 compare:str1 options:(NSNumericSearch)];
    }
}];

//yourArray is now sorted

【讨论】:

  • yourArray = [yourArray sortUsingComparator......}];。我们必须将结果输出分配给数组,然后它将打印期望输出
【解决方案5】:

The answer from Darshit Shah 顺利完成

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc]initWithKey:@"rank"  ascending:YES selector:@selector(localizedStandardCompare:)];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2016-10-28
    • 1970-01-01
    • 2021-04-28
    • 2021-08-12
    • 2019-05-26
    相关资源
    最近更新 更多