【问题标题】:objective-C, sort an array of strings containing numbers [duplicate]Objective-C,对包含数字的字符串数组进行排序[重复]
【发布时间】:2014-08-11 11:09:54
【问题描述】:

假设我有一个这样的数组

NSArray* arr = @[@"1",@"4",@"2",@"8",@"11",@"10",@"14",@"9"]; //note: strings containing numbers

我想像这样对它们进行排序:[1,2,4,8,9,10,11,14]

但如果我使用

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

我得到 [1,10,11,14,2,4,8,9]... 如果我使用:

   NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"length" ascending:YES];
   NSArray *sortDescriptors = @[sortDescriptor];
   [arr sortedArrayUsingDescriptors:sortDescriptors];

我得到这样的结果:[1,4,2,8,9,11,10,14]

如何结合两个谓词?还是有其他更简单的方法来解决这个问题?注意:这个数组的输出仅用于调试目的,我不在乎结果是否将数组转换为整数,只要我可以在控制台中打印 NSLog 谢谢

【问题讨论】:

  • 实际上,返回最小值和最大值之间缺失数字的函数会更好...示例输入:[1,5,4]...输出:[2,3]

标签: ios objective-c nsarray nssortdescriptor


【解决方案1】:

尝试使用积木

[arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

    if ([obj1 intValue] == [obj2 intValue])
        return NSOrderedSame;

    else if ([obj1 intValue] < [obj2 intValue])
        return NSOrderedAscending;

    else
        return NSOrderedDescending;

}];

【讨论】:

  • 谢谢朋友,我只需要将“>”更改为“
  • 哦,对不起,我的错。我更新了答案。
  • 这个答案的重要部分在最小的解释中丢失了。您可以使用块或排序描述符进行排序——这里的区别不是 blocks。重要的是使用-intValue,而不是尝试结合-length-localizedCaseInsensitiveCompare:
【解决方案2】:

问题是您试图同时使用字符串比较和-length 来拼凑您真正想要的东西,即数字比较。但是排序描述符一次应用一个,并且仅当第一个描述符将两个项目排序为相同时才使用第二个描述符。使用-intValue 对项目进行排序允许您使用单个排序描述符,该描述符将按照您想要的方式对项目进行排序。

改为这样做:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"intValue" ascending:YES];
[arr sortedArrayUsingDescriptors:@[sortDescriptor]];

【讨论】:

    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    相关资源
    最近更新 更多