Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 按字母顺序和长度对字符串排序?_Objective C_Sorting_Nsarray_Nssortdescriptor - Fatal编程技术网

Objective c 按字母顺序和长度对字符串排序?

Objective c 按字母顺序和长度对字符串排序?,objective-c,sorting,nsarray,nssortdescriptor,Objective C,Sorting,Nsarray,Nssortdescriptor,我想按长度对NSStrings数组进行排序,但随后将所有长度相同的字符串按字母顺序进行子排序。例如,猫,帽子,禅,九,率,故事,访问,消失 我该怎么做?我试图找出NSSORTD的描述者已经有一个小时了,但一无所获。我不知道使用什么键来按字母顺序或长度对字符串进行排序。我已经使用SortDarrayUsingSelector按字母顺序对它们进行了排序,但是通过KevinTTrimm的评论链接,我需要使用NSSortDescriptor,以便按两个指标进行排序,所以我需要知道键 我一直在想NSSOR

我想按长度对NSStrings数组进行排序,但随后将所有长度相同的字符串按字母顺序进行子排序。例如,猫,帽子,禅,九,率,故事,访问,消失

我该怎么做?我试图找出NSSORTD的描述者已经有一个小时了,但一无所获。我不知道使用什么键来按字母顺序或长度对字符串进行排序。我已经使用SortDarrayUsingSelector按字母顺序对它们进行了排序,但是通过KevinTTrimm的评论链接,我需要使用NSSortDescriptor,以便按两个指标进行排序,所以我需要知道键

我一直在想NSSORTD的描述者大概有一个小时了

为什么要使用NSSORTDescriptor呢?我的意思是,它们很好,但是使用sortedArrayUsingComparator这样的东西要容易得多:因为你可以编写自己的测试,说明什么值大于什么值小于什么值。

最终得到了:

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,但不管怎样…

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

正如您在NSSSortDescriptor的文档中所看到的,通过指定要比较的属性的键路径来创建排序描述符。按长度对字符串排序时,您要查找的NSString的属性是length:

因为您希望单词越来越长,所以排序描述符应该是升序的,以便后面的值比前面的值具有更大的长度

NSSortDescriptor *byLength =
    [NSSortDescriptor sortDescriptorWithKey:@"length" ascending:YES];
接下来,要按字母顺序对字符串进行排序,您真正需要的是直接将该字符串与另一个字符串进行比较。有几种不同的方法可以做到这一点。例如,可以使用KVC调用NSString上的description方法来返回这个NSString对象,也就是对象本身。这将是一种选择

NSSortDescriptor *alphabeticallyAlternative1 =
    [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
您可以通过KVC调用的其他方法有,例如大写字符串或小写字符串。在排序描述符中使用这两种方法中的任何一种都将使其成为不区分大小写的比较,这对您有用,也可能不有用

// 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]];

你一定在那一小时里完成了什么。如果您能告诉我们您走了多远以及卡在哪里,这将对我们有所帮助。@DavidRönnqvist的可能副本我一直不知道NSSortDescriptor使用什么属性键,以便按字母顺序或长度对字符串排序。我看到了KevenDTrimm链接到的答案,但我找到的所有示例都只向您展示了如何处理任意对象。我还没有弄清楚如何使用NSSORTDescriptor对NSString进行排序,因为我不知道要使用什么属性。而现在,这一切都无缘无故地被遗忘了,所以这是相当令人沮丧的。上帝禁止有经验的iOS程序员考虑这个琐碎的——自动的愚蠢的问题,下注。2下投票不被遗忘;还要注意的是,如果你遵循第一条评论的建议和侧边栏中的一些问题,你可能会走得更远。请记住,否决票是可以撤销的。您使用NSSortDescriptor的哪个键按字母顺序对字符串排序!!!!!!!!!!!不使用SorterDarrayusingSelector!!这里有一个例子,来自我的书:我的上帝,一个有用的答案!还有希望。我试图找到一个比较工作原理的清晰解释…我需要调整块以按长度排序,如果长度相等,则按字母顺序排序。我的意思是,我愿意使用任何有效的方法-这只是一个问题,我能够理解哪一种方法,以便首先正确修改。我将其编辑为-NSArray*arr2=[words sortedarrayingcomparator:^NSString*s1,NSString*s2{if[s1 length]!=[s2 length]{return[s1 compareBySize:s2];}else返回[s1比较:s2];}];但是compareBySize当然不是一个真正的选择器,所以我试图弄清楚应该如何编写它。如果我可以使用布尔值,那么当然是很容易的,但是必须有这个NSRAMISISON结果的东西……很好地解释了答案,我需要密钥的名称,这在文档中并不明显,如果你是新的基金会…就在我用积木得到它之后,如我的回答所示。但你的答案当然要简洁得多。非常感谢。乍一看,它们在简洁性上大致相同,但这
这仍然是我最初想要的。这对我的答案没有任何帮助,加上堆栈溢出不是一个发泄的地方。当然,我删除了发泄,但它增加了你的答案,因为它实际上显示了你需要什么。我喜欢完整的代码示例。好吧,我从来不会为了迎合你而为你编写代码对于那些需要这种东西的堆栈溢出用户,我也没什么可说的。作为一名教师,我的工作是向你展示一扇敞开的门,而不是带你走过它。这是一种我以前从未听说过、也从未考虑过的高度独创的情感。但作为一名经验丰富的开发人员,我很清楚什么可以帮助我以最佳方式学习新的语言或框架,我知道查看完整的代码示例对我来说是最有用的,因为它可以帮助我了解不同的部分是如何工作的,而无需我猜出来,也无需我自己浪费时间将相同的示例拼凑在一起。在我了解齿轮之后,我就可以开始制造引擎了。例如,当你给我提供关于开门策略的建议时,你可能会认为有人试图去做这件事,必须知道块和它们是如何工作的,知道SoDeDayRaySuin比较器方法,我不知道,关于NSCONT vs int i,我不知道比较结果,也不知道比较方法。同时不断地受到各种来源的鼓励不,用这种完全不同的方法来做,这种方法需要大量的其他知识,这是Objective-C新手所不具备的。
NSArray *sorted =
    [someStrings sortedArrayUsingDescriptors:@[byLength, alphabetically]];