tem*_*ame -3 sorting objective-c nsarray nssortdescriptor
我想按长度对 NSString 数组进行排序,然后让所有相同长度的字符串按字母顺序进行子排序。例如,“猫、帽子、禅宗、九、速率、故事、访问、消失”。
我怎样才能做到这一点?我花了大约一个小时试图找出 NSSortDescriptors 但一无所获。我不知道使用什么键来按字母顺序或按长度对 NSString 进行排序。我已使用按字母顺序对它们进行排序sortedArrayUsingSelector,但通过 KevinTTrimm 的评论链接,我需要使用 NSSortDescriptor 才能按两个指标进行排序,因此我需要知道键。
tl;dr:您正在寻找的关键路径是“length”和“self”(或“description”或“uppercaseString”,具体取决于您想要比较的方式)
正如您在 NSSSortDescriptor 的文档中所看到的,“通过指定要比较的属性的键路径”创建排序描述符。当按长度对字符串进行排序时,您要查找的 NSString 属性是length:
@property(readonly) NSUInteger length;
Run Code Online (Sandbox Code Playgroud)
由于您希望单词越来越长,因此该排序描述符应该升序,以便后面的值比前面的值具有更大的长度。
NSSortDescriptor *byLength =
[NSSortDescriptor sortDescriptorWithKey:@"length" ascending:YES];
Run Code Online (Sandbox Code Playgroud)
接下来,要按字母顺序对字符串进行排序,您真正想要的是将字符串直接与另一个字符串进行比较。您可以通过几种不同的方法来执行此操作。例如,descriptionNSString 上的方法(可以使用 KVC 调用)被记录为返回“This NSString object”,即对象本身。那将是一种选择。
NSSortDescriptor *alphabeticallyAlternative1 =
[NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
Run Code Online (Sandbox Code Playgroud)
您可以通过 KVC 调用的其他方法例如uppercaseString或lowercaseString。在排序描述符中使用其中任何一个都会使其成为不区分大小写的比较(这对您有用,或者没有)。
// case-insensitive comparison
NSSortDescriptor *alphabeticallyAlternative2 =
[NSSortDescriptor sortDescriptorWithKey:@"uppercaseString" ascending:YES];
Run Code Online (Sandbox Code Playgroud)
直接将字符串本身与其他字符串进行比较的第三种方法是使用键路径"self"。有时您会看到它被用在谓词中。
NSSortDescriptor *alphabeticallyAlternative3 =
[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
Run Code Online (Sandbox Code Playgroud)
在所有 3 种情况下,排序描述符均按升序排列,以便字母表中较晚出现的字母在数组中较晚出现。
无论您选择哪个版本的字母排序,由于您想首先按长度排序,因此您将首先传递 byLength 描述符,然后传递字母描述符。
NSArray *sorted =
[someStrings sortedArrayUsingDescriptors:@[byLength, alphabetically]];
Run Code Online (Sandbox Code Playgroud)