我有一个带有我想要排序的数字的播放列表的数组,一切都很好,直到我的数字达到10.数组排序10后1而不是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];
}];
答案 0 :(得分:2)
你有两个明显的问题,只有一个是排序。
首先,当10
正在执行词典("字母"但扩展到所有字符)时,NSSortDescriptor
出现在错误的位置一个以1
开头的字符串出现在以2
等开头的
要解决此问题,您需要进行比较,按字符串数字对字符串中的数字进行排序。指定了NSString
选项的compare:options:
NSNumericSearch
方法会执行此操作。
使用带有比较器的NSArray
或NSSortDescriptor
方法之一,即块中的块,参数和调用compare:options:
。有关详细信息,请参阅NSString
,NSArray
,NSSortDescriptor
等文档。
你写的第二个:
playlists = (NSMutableArray*)[sortedArray...
您无法只是将NSArray
转换为NSMutableArray
以使其变为可变。使用mutableCopy
执行此操作,就像在下一行中一样:
playlists = [meshGroups mutableCopy];
会立即丢弃刚刚生成的已排序数组...
HTH
答案 1 :(得分:-2)
您可以使用
- (NSArray<ObjectType> *)sortedArrayUsingComparator:(NSComparator)cmptr
API并在 cmptr block 中编写自己的比较逻辑。
这是我所知道的最简单,最可靠的方法,可以实现您想要的输出。 希望它有所帮助。