【问题标题】:NSMutable array sort 10 after 1NSMutablearray 在 1 后排序 10
【发布时间】:2017-05-08 03:17:11
【问题描述】:

我有一个包含播放列表的数组,其中包含我喜欢排序的数字,在我的数字达到 10 之前一切都很好。数组在 1 之后排序为 10 而不是 9,我该如何解决这个问题?

这是我的代码:

NSArray *sortedArray = [NSArray arrayWithArray:playlists];
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
playlists = (NSMutableArray*)[sortedArray sortedArrayUsingDescriptors:@[sort]];
playlists = [meshGroups mutableCopy];

编辑:

这里我做了什么改变,以便数组在 9 之后排序 10,而不是在 1 之后:

我变了

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) {
    return [(NSString*) obj1 compare:(NSString*) obj2 options:NSNumericSearch];
}];

【问题讨论】:

    标签: objective-c arrays sorting


    【解决方案1】:

    你有两个明显的问题,只有一个是排序。

    首先,您的10 出现在错误的位置,因为您的NSSortDescriptor 正在执行lexicographic(“按字母顺序排列”但扩展到所有字符)排序和以1 开头的字符串以2 等开头。

    要解决这个问题,您需要进行比较,按数值对字符串中的数字进行排序。 NSStringcompare:options: 方法指定了 NSNumericSearch 选项将执行此操作。

    使用NSArrayNSSortDescriptor 方法之一,该方法采用比较器,即块、参数并在块中调用compare:options:。有关详细信息,请参阅NSStringNSArrayNSSortDescriptor 等的文档。

    第二次写:

    playlists = (NSMutableArray*)[sortedArray...
    

    不能简单地将 NSArray 转换为 NSMutableArray 以使其可变。使用mutableCopy 来执行此操作,就像您在下一行中所做的那样:

    playlists = [meshGroups mutableCopy];
    

    它会立即丢弃您刚刚生成的排序数组...

    HTH

    【讨论】:

    • 谢谢,提供了很多信息。我会做的改变
    【解决方案2】:

    你可以使用

    - (NSArray<ObjectType> *)sortedArrayUsingComparator:(NSComparator)cmptr

    API 并在 cmptr 块中编写您自己的比较逻辑

    这是我所知道的实现您想要的输出的最简单、最可靠的方法。 希望对您有所帮助。

    【讨论】:

    • 我现在正要这样做,我想我可以做得更好
    • 你可以试试 sortedArrayUsingSelector,虽然我更喜欢块,所以我用块来回答。如果它解决了问题以帮助将来寻求答案的人,请接受答案。
    • 为什么投反对票,谁做过。我的回答对案件没有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多