Obj/C: 按照自定义顺序对数组进行排序

5
我有一个NSMutableDictionaries数组,其中包含(除其他外)Location键。我需要对数组进行排序以将其输入表格。顶部应为N,下面应为A,再下面应为R。因此,在排序中:如何按顺序对数组进行排序:N-A-R?
编辑:我可以通过查看两个变量来排序,但我使用的变量不止两个(总共7个)...
谢谢,
1个回答

6

如果你的数组是可变的,你可以使用-sortUsing...方法进行排序。如果不是,你可以使用-sortedArrayUsing...方法创建一个新的已排序的数组。例如,有-sortUsingComparator:和-sortedArrayUsingComparator:方法,它们将比较器块作为参数。你只需要提供一个块,使用你的自定义排序顺序比较两个对象,就像这样:

[myArray sortUsingComparator:^(id firstObject, id secondObject) {
    NSString *firstKey = [firstObject valueForKey:@"location"];
    NSString *secondKey = [secondObject valueForKey:@"location"];
    if ([firstKey stringEqual:@"N"] || [lastKey stringEqual:@"R"])
        return NSOrderedAscending;
    else if ([firstKey stringEqual:secondKey])
        return NSOrderedSame;
    else
        return NSOrderedDescending;
}];

集合编程主题文档中,有一个涵盖了数组排序的详细讨论和示例。


@Caleb 谢谢Caleb,那有点帮助我了。我仍然在努力对更多位置进行排序,N出现在顶部,但是下面的所有字母都在一起,但是是随机排序的。我的总位置列表应该是 N-G-B-A-F-C。例如,所有A在一起,但不直接在B下面。排序后的顺序为N-B-C-F-A-G。我多次使用了你使用的代码块,也许有什么地方出错了…? - Joetjah
@Caleb 当然,多次使用此代码块是行不通的(并且会随机偏离)。我之前发表评论时有点匆忙,没有足够的思考。虽然对我来说使用两个键是有效的,但是当我需要使用超过2个键时,我就遇到了困难。有什么建议吗? - Joetjah
@Joetjah,我不确定你在使用块多次方面的意思。我也不一定推荐使用完全相同的代码,特别是如果您有超过最初指定的三个值。我只是举了一个快速而简单的例子。更好的方法可能是将顺序定义为字符串:“NBCFAG”。然后,您可以在字符串中找到每个字典的位置值并比较它们的索引。这对于更多可能值的情况扩展得更好。 - Caleb
@Caleb,那么我该如何使用该字符串对包含所有字典的数组进行排序呢?抱歉打扰你这么多,哈哈... - Joetjah
@Joetjah,你可以像我在发布的代码中所做的那样获取每个字典的值。然后在顺序字符串中找到每个值。你可以使用-rangeOfString:来实现。最后,比较索引(每个范围的开头)以确定哪个值首先出现在顺序字符串中,因此应该首先排序。你不必使用NSString来定义顺序...你可以使用数组、C字符串或任何其他使你能够定义有序字符集的方式。 - Caleb
@Caleb 那就可以了...我会在几分钟内尝试一些东西^^感谢你的帮助! - Joetjah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接