对包含数字的NSArray进行排序

14
我有一个NSArray,其中填充了来自NSMutableArray的对象。 这些对象中大多数都具有像“1”,“2”,“3”,“4”,“5”这样的整数值,有时会出现像“home”,“far left”或“far right”这样的名称。 我正在尝试在Objective C中对此数组进行排序。 当数组中的项目少于10个时,使用sortedArrayUsingSelector:@selector(compare :)可以正常工作。 但是当有更多项目时,我开始得到“1”、“10”、“11”、“12”、“2”、“3”之类的东西。 任何帮助都将不胜感激。 代码不应该返回任何内容。 它只需要排序并继续运行。

原始代码:


```objective-c NSArray *unsortedArray = [NSArray arrayWithArray:myMutableArray]; NSArray *sortedArray = [unsortedArray sortedArrayUsingSelector:@selector(compare:)];
```
presetNamesSort = [[[NSMutableArray alloc]init]retain];

presetNamesSort = [presetNames sortedArrayUsingSelector:@selector(compare:)];
3个回答

42

你可以使用 NSArray-sortedArrayUsingComparator: 方法来使用自定义块获取排序后的数组。我发现这比使用 -sortedArrayUsingSelector: 更方便,因为你可以内联声明比较器,像这样:

NSArray *unsortedArray = [NSArray arrayWithObjects:@"Hello", @"4", @"Hi", @"5", @"2", @"10", @"1", nil];
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:NSNumericSearch];
}];
这将返回一个看起来像这样的数组:
(
    1,
    2,
    4,
    5,
    10,
    Hello,
    Hi
)

总的来说,使用块非常好,因为它们消除了在代码中运行不规则选择器的需要。


1
我们应该提到,块需要iOS 4或更高版本。如果是这种情况,这个答案是最优雅的。/@Ribbons - Ortwin Gentz
我已经使用你的解决方案对一个数组进行了排序,效果很好。但是我还有另一个问题,我需要按条件对一个数组进行排序。比如我有两个值:“公司”和“日期”。如果公司名称相同,则检查日期,最新的排在前面。你能帮我吗? - Hiren
@CocoaMatters,您需要使用 NSArray-sortedArrayUsingDescriptors: 方法,并使用 NSSortDescriptor 根据多个条件进行排序。 您可以创建两个排序描述符(一个基于“company”键,另一个基于“date”键),它将使用这两个键进行排序。 - Itai Ferber
@ItaiFerber 我知道我想使用NSSortDescriptor进行排序。但我的情况嵌套在同名的情况下,需要检查日期进行排序。在我的数组中,一个对象包含两个值“公司”和“日期”。 - Hiren
@CocoaMatters 排序描述符会为您处理嵌套。创建一个带有两个排序描述符的 NSArray:第一个是“公司”,第二个是“日期”。排序后的数组将首先按公司排序,然后对于具有相同公司的条目,再按日期排序。 - Itai Ferber

1

尝试使用-[NSString compare:options:]NSNumericSearch。要在-sortedArrayUsingSelector:中使用它,您必须将比较调用包装到NSString的单独类别方法中:

- (NSComparisonResult)numericCompare:(NSString *)aString {
    return [self compare:aString options:NSNumericSearch];
}

presetNamesSort = [[[NSMutableArray alloc]init]retain]; presetNamesSort = [presetNames sortedArrayUsingSelector:@selector(compare:)];预设名称排序 = [[[NSMutableArray alloc]init] retain]; 预设名称排序 = [预设名称 sortedArrayUsingSelector:@selector(compare:)]; - Ribbons Almark
这是原始代码用于获取结果,presetNames是一个NSMuttableArray,而presetNamesSort是一个常规数组。因此,我需要presetNamesSort包含presetNames的排序内容。 - Ribbons Almark

0

用于降序排序

NSArray *sortedArray = [arrayToSort sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:NSNumericSearch];
}];
sortedArray = [[sortedArray reverseObjectEnumerator] allObjects];`

对于升序排列

NSArray *sortedArray = [arrayToSort sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:NSNumericSearch];
}];

嗨,@SGRKDL - 我想让你知道,多行代码格式化是在每行前加上四个空格完成的。撇号用于较短的内容,例如 'ClassName'。我已经为您进行了调整,这样您就可以看到了。 - Logan

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