按字母顺序按字符串排序字符串?

时间:2014-11-24 21:06:07

标签: objective-c sorting nsarray nssortdescriptor

我希望按长度对NSStrings数组进行排序,但是所有长度相同的字符串都要按字母顺序进行子排序。例如,“猫,帽子,禅,九,率,故事,访问,消失。”

我该怎么做?我一直试图弄清楚NSSortDescriptors一个小时而且无处可去。我不知道使用什么键来按字母顺序或长度排序NSStrings。我使用sortedArrayUsingSelector按字母顺序对它们进行了排序,但是在KevinTTrimm的注释链接上,我需要使用NSSortDescriptor来按两个指标排序,所以我需要知道密钥。

3 个答案:

答案 0 :(得分:4)

tl; dr:您要查找的关键路径是“长度”和“自我”(或“描述”或“大写字符串”,具体取决于您要比较的方式)


正如您在NSSSortDescriptor的文档中所看到的,“通过指定要比较的属性的关键路径”来创建排序描述符。按 length 对字符串进行排序时,您要查找的NSString上的属性为length

@property(readonly) NSUInteger length;

由于您希望单词更长更长,因此该排序描述符应该是升序的,以便后面的值的长度大于之前的值。

NSSortDescriptor *byLength =
    [NSSortDescriptor sortDescriptorWithKey:@"length" ascending:YES];

接下来,要按字母顺序对字符串进行排序,您真正想要的是将字符串直接与其他字符串进行比较。有几种不同的方法可以做到这一点。例如,NSString上的description方法(可以使用KVC调用)被记录为返回“This NSString object”,表示对象本身。这将是一种选择。

NSSortDescriptor *alphabeticallyAlternative1 =
    [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];

您可以通过KVC调用的其他方法例如是uppercaseStringlowercaseString。在排序描述符中使用其中任何一个将使它成为不区分大小写的比较(对您有用,或者不对您有用)。

// case-insensitive comparison
NSSortDescriptor *alphabeticallyAlternative2 =
    [NSSortDescriptor sortDescriptorWithKey:@"uppercaseString" ascending:YES];

将字符串本身直接与另一个字符串进行比较的第三种方法是使用密钥路径"self"。您有时会看到这在谓词中使用。

NSSortDescriptor *alphabeticallyAlternative3 =
    [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];

在所有3个案例中,排序描述符都是升序的,以便字母表中稍后出现的字母在数组中稍后出现。


您选择的字母排序版本,因为您希望首先按长度排序,然后首先传递byLength描述符,然后传递字母描述符。

NSArray *sorted =
    [someStrings sortedArrayUsingDescriptors:@[byLength, alphabetically]];

答案 1 :(得分:2)

  

我一直试图找出NSSortDescriptors一个小时

为什么要使用NSSortDescriptors?我的意思是,它们很好,但使用像sortedArrayUsingComparator:之类的东西要容易得多,因为你可以编写自己的测试,说明什么算得上是什么,什么算得更重要。

答案 2 :(得分:0)

最后得到了:

NSArray* words2 = [words sortedArrayUsingComparator: ^(NSString* s1, NSString* s2) {
    if([s1 length] != [s2 length]){
        NSNumber* s1length = [NSNumber numberWithInt:[s1 length]];
        NSNumber* s2length = [NSNumber numberWithInt:[s2 length]];
        return [s1length compare:s2length];
    }
    else return [s1 compare:s2];
}];

不确定为什么他们认为布尔值不足并添加了NSComparisonResult,但无论如何......