【问题标题】:Sorting is not working correctly排序工作不正常
【发布时间】:2012-11-05 18:47:47
【问题描述】:

我通过我的应用程序将一些文件保存在文档目录中,使用自定义命名为“file1.format”、“file2.format”等等。后来我在一个数组中获取这些文件并在循环中打印它们然后它们是以排序形式出现,但是当我存储“file10.format”等时出现问题。在这之后的结果来得有些出乎意料。保存第 10 个文件后,输出就像

file1.foramt 文件10.format 文件2.格式 . . 文件6.格式 文件61.format 文件7.格式 我不知道为什么排序将所有 1 或 2 放在一个地方,如上所示,而预计 10 应该在 9 之后而不是在 1 之后。我使用了所有类型的排序,但结果始终相同。

【问题讨论】:

  • 名称是字符串而不是整数。如果您用串眼看它,那么正如第一个答案所暗示的那样,它是正确的。您查看字符串,因为它应该是一个整数

标签: iphone objective-c sorting nsarray


【解决方案1】:

如果您想“像 Finder 那样”对文件名进行排序,请使用 localizedStandardCompare。特别是,字符串中的数字是根据它们的数值排序的:

NSArray *files = [NSArray arrayWithObjects:@"file10.format", @"file2.format", @"file1.format", nil];
NSArray *sorted = [files sortedArrayUsingSelector:@selector(localizedStandardCompare:)];
NSLog(@"%@", sorted);

输出:

2012-11-05 11:38:55.474 test77[533:403] (
    "file1.format",
    "file2.format",
    "file10.format"
)

【讨论】:

  • 这也给出了相同的结果,而不是输出显示的结果。 :(
  • @Abhinav:奇怪。我已经在 iOS 模拟器和 iPhone 设备上对此进行了测试。输出正是我的代码的输出。
  • @Abhinav:也许您可以向您的代码展示数组是如何排序的。
  • 我真的很抱歉。实际上我犯了一个愚蠢的错误。你的代码是正确的并且运行良好。谢谢
【解决方案2】:

如果您想使用常规的字符串排序顺序,那么您应该考虑重命名您的文件。 file00001.formatfile00002.format 等等。在这种情况下,file00010.format 跟在 file00009.format 后面,file00011.format 跟在后面

【讨论】:

  • 我可以这样做,但实际上我必须向用户显示相同的文件名,这样会有点不可读。
  • 那么,您可以使用 NSSortDescriptor 对数组进行排序,该 NSSortDescriptor 使用自定义选择器来确定比较结果。这样,您自己的比较选择器(某种方法)将提取文件名的 numeirc 元素并返回相应数字对象的比较结果。
【解决方案3】:

它实际上工作正常。

file10.format

来之前

file2.format 

因为字符 0 被视为小于与之比较的字符 .(这两个字符在各自的文件名中位于相同的位置。

事实上,在您使用精美图形操作系统的年轻人之前,文件系统也是这样对文件进行排序的。 老人吐槽>

【讨论】:

  • 谢谢布赖恩威利斯,但我应该怎么做才能以所需的格式出现,如 1,2,3 等等?那么11,12和其他人呢。它只是将所有 1 集合起来,然后 2 等等。
  • 您可以在文件名中添加前导零,因此file2.format 将变为file02.format
  • 我明白了你的原因,但我的问题还是一样。我应该怎么做才能以数字等可读格式出现。
  • 这可能很棘手。这是一个很好的 Stack Overflow 问题,可能会有所帮助:stackoverflow.com/questions/2849911/sorting-a-nsarray
猜你喜欢
  • 2016-07-06
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 2012-03-29
  • 2018-07-18
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多