【问题标题】:NSArray of strings sort issue [duplicate]NSArray字符串排序问题[重复]
【发布时间】:2013-11-27 10:16:08
【问题描述】:

所以我有以下代码:

NSArray *pathArray = @[@"path/Documents/page9.png",
    @"path/Documents/page8.png",
    @"path/Documents/page10.png",
    @"path/Documents/page11.png",
    @"path/Documents/page0.png",
    @"path/Documents/page12.png",
    @"path/Documents/page6.png",
    @"path/Documents/page4.png",
    @"path/Documents/page5.png",
    @"path/Documents/page1.png",
    @"path/Documents/page7.png",
    @"path/Documents/page3.png",
    @"path/Documents/page2.png"];

如果我现在使用以下方法对数组进行排序:

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

数组排序错误

结果:

pathArray: (
    "path/Documents/page0.png",
    "path/Documents/page1.png",
    "path/Documents/page10.png",
    "path/Documents/page11.png",
    "path/Documents/page12.png",
    "path/Documents/page2.png",
    "path/Documents/page3.png",
    "path/Documents/page4.png",
    "path/Documents/page5.png",
    "path/Documents/page6.png",
    "path/Documents/page7.png",
    "path/Documents/page8.png",
    "path/Documents/page9.png"}

带有"page10.png", "page11.png" and "page12.png" 组件的元素应该是最后三个元素。是否存在涵盖此问题的其他选择器?

如果不是,怎么可能做到这一点?

【问题讨论】:

标签: objective-c arrays string sorting


【解决方案1】:

你可以使用这个实现你自己的比较方法:

[pathArray sortUsingComparator:^(id one, id two) {
    return [one compare:two options:NSCaseInsensitiveSearch | NSNumericSearch];
}

【讨论】:

  • +1。很好的发现 - 我不知道这个。
  • 文件名是否可以更改的可靠解决方案。
  • +1 更简单、更干净。
  • 简短而可靠的答案,感谢这个!
【解决方案2】:

这是因为你的文件名不一致,例如:

path/Documents/page0.png

应该是:

path/Documents/page00.png

每个文件都有一个 2 位数字。解决此问题后,您的排序将正常工作。

【讨论】:

  • 我认为解决办法不应该来自更改文件名,他可能无法做到
  • @AntonioMG 这取决于限制是什么。如果这是我的项目,那么我会更加一致。但是,如果无法更改文件名,我更喜欢您的回答。
  • 你的答案也是正确的,我不知道这会解决问题。
  • @pmk 这取决于您必须对这些文件中的多少进行排序,但我刚刚测试了 1,000,000 个像这样格式化的对象,并且您的原始排序速度明显更快(您的原始方法是 firstNSNumericSearch 方法是second): first=0.340271, second=2.776139
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多