使用包含数字的字符串对NSMutableArray进行排序?

6

我有一个NSMutableArray,里面保存了用户的高分。我想按数字顺序排列项目(数字存储在NSStrings中)
例如:
4,2,7,8
变成
2,4,7,8
如果数据存储在NSStrings中,最简单的方法是什么?


2
你看过文档了吗?NSMutableArray的文档呢?NSString的呢?NSComparator的呢?这真的非常简单。 - Colin
7
如果这么容易,你能回答问题而不是抱怨吗? - Allison
但是如果他能让你意识到许多答案可以在文档中找到,并让你学会如何使用它,那么也许下次你遇到问题时就会去查看文档 :) - David Rönnqvist
1
没错,那天我只是觉得不太想出门。 - Allison
5个回答

23

这段代码可以实现:

//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)。


我遇到了一个错误:不兼容的块指针类型正在初始化'int(^)(struct NSString*, struct NSString*)',预期为'NSComparator' - Allison
@TheDeveloper,我刚刚将我的代码复制粘贴到Xcode中,它编译通过并且运行正常。你可能做错了什么。 - Adam
你是在使用 ARC 吗?我刚刚复制并构建了一下,它却报了错。 - Allison
啊,好吧,我想我只能再次向StackOverflow社区寻求帮助了。 - Allison
有没有什么想法可以将数组从大到小排序? - Mike97
1
@user3123201 将 str2 与 str1 进行比较。 - Adam

1
如果数组是包含键为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......}];。我们必须将结果分配给数组,然后才能打印所需的输出。 - NSPratik

1
这段代码有效。我已经尝试过了:
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

如果您对代码有任何疑问,请在评论中提出。希望这能帮到您!


@TheDeveloper 你说得对。它们是NSSNumber对象,但将它们转换回字符串非常容易。 - pasawaya

1

NSMutableArray方法sortUsingSelector:应该可以实现:

[scoreArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]

应该这样做。


这只是进行字符串比较,并且效果不佳。例如,如果您有一个数组,其中包含@"10"、@"25"、@"50"、@"51"、@"2000"等元素,运行比较将给出:@"10"、@"2000"、@"25"、@"50"、@"51"。可能不是您想要的结果。@Adam的答案是正确的。 - Z S

0

这个答案来自Darshit Shah,使它顺畅运行

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接