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 NSMutableArray使用选择器排序_Objective C_Sorting - Fatal编程技术网

Objective c NSMutableArray使用选择器排序

Objective c NSMutableArray使用选择器排序,objective-c,sorting,Objective C,Sorting,我在谷歌上搜索过stackoverflow,但没有令人满意的答案 文件中指出: sortUsingSelector:对数组的 按升序排列的元素,如 由比较法确定 由给定的选择器指定 (无效)sortUsingSelector:(SEL)比较器 参数比较器 指定要使用的比较方法 比较数组中的元素。这个 将比较器消息发送到每个 对象,并将其作为 单个参数是另一个对象 数组。比较法应 如果数组 比论据小,, 如果阵列为空,则取消搜索 比论据大,而且 如果它们相等,则重新命名 我想知道它到底是怎么工

我在谷歌上搜索过stackoverflow,但没有令人满意的答案

文件中指出:

sortUsingSelector:对数组的 按升序排列的元素,如 由比较法确定 由给定的选择器指定

  • (无效)sortUsingSelector:(SEL)比较器 参数比较器 指定要使用的比较方法 比较数组中的元素。这个 将比较器消息发送到每个 对象,并将其作为 单个参数是另一个对象 数组。比较法应 如果数组 比论据小,, 如果阵列为空,则取消搜索 比论据大,而且 如果它们相等,则重新命名
我想知道它到底是怎么工作的。所以如果我在我的对象中有这个方法 数组类:

- (NSComparisonResult) compareNames: (id) element
{
    return [userName compare: [element userName]];
}
并用

[myArray sortUsingSelector:@selector(compareNames:);
它起作用了。问题是我不知道为什么它会起作用。NSComparisonResult的返回类型 是升序、相同还是降序。我通过阅读文档得到的信息是 compareNames方法被发送到myArray中的每个对象,并比较所选对象 对象属性(在本例中为userName),其中的用户名位于 相同的数组。(与[0]数组与[1]数组类似)。我想知道这是怎么回事 整个过程正在进行

更新1:多个键的排序算法

我错过了比赛!在比较中。应该是这样的:

NSComparisonResult res;
res = [[self userName] compare: [element userName]];
if(res == NSOrderedSame) res = [[self email] compare: [element email]];
return res;
对于降序排序,您可以使用switch或if通过将“return res”替换为以下内容来还原NSComparisonResult值:

switch (res)
    {
        case NSOrderedAscending:
            return NSOrderedDescending;
            break;
        case NSOrderedDescending :
            return NSOrderedAscending;
            break;
        default:
            return NSOrderedSame;
            break;
    }*/

sortUsingSelector
将使用快速排序或类似的排序算法对数组进行排序。排序算法需要能够比较要排序的集合中的两个项目,并确定它们应该以排序顺序相对显示在哪里。A应该出现在B之前、B之后还是紧靠着它?您的自定义排序方法(
compareNames
在您的示例中)是确定排序所需的全部排序算法

请看一下这方面的背景资料


如果你搜索例如“sortUsingSelector”,你在网上找不到太多关于这方面的信息。这不是一个特定于Objective-C的问题,几乎所有编程语言都有使用用户定义的比较函数进行排序的排序例程。

要回答注释中的子问题:

排序总是需要升序吗?-
sensorderedescending
&
sensorderedescending
在这里只是符号,您最好将它们视为排序顺序中的“对象在参数之前”和“对象在参数之后”。例如,如果您正在存储一个NSNumber的数组,则如果要按递增值排序,“1 compareTo:2”应返回
SensorDeredescing
,如果要按递减值排序,则应返回
SensorDeredescing

如何使用多个键进行排序任何排序算法只需要知道一个项目是在另一个项目之前、之后还是在同一位置。你如何决定这取决于你自己。要使用两个排序键,则在伪代码中,算法为:

To compare item1 and item2
    order = [item1.key1 compareTo:item2.key1];
    if (order == NSOrderedSame) order = [item1.key2 compareTo:item2.key2];
    return order
根据需要扩展到更多键或更复杂的比较


评论的后续行动:


很抱歉,但是提供的算法会进行2键排序,通常情况下,组合键可能不会,而且是浪费时间的

在英语中,按两个键排序如下:首先比较每个对象的第一个键,如果它们不相等,则返回它们的顺序。如果它们比较相等,则继续并比较每个对象的第二个关键点,并返回它们的顺序

这正是上面的伪代码所做的

由于多种原因,组合多个键存在问题:

  • 必须使用不能出现在键中的分隔符组合它们。作为一个简单的例子,考虑当你有两个人“jack yolander”和“jacky olander”时,按姓名、姓氏分拣,一个天真的加入会产生“JeYyOLAND”,他们会平等。因此,您需要一个不能出现在任何键中的分隔符

  • 如果键的类型不同,例如一个字符串和一个数字,那么最终会将它们全部转换为字符串以进行组合,这是浪费,甚至可能是不准确的

  • 简单地将它们组合起来是浪费的——您正在生成您不需要的对象


  • 等。只需成对比较键,直到找到两个不同的键或找到最后一对。适用于任意数量、任意类型的键,不会造成浪费。

    您到底不了解什么?基本上,它会比较对象的所有对并交换它们,如果它们的顺序不正确。(但实际上,不必比较所有的paire,n*log(n)就足够了。)排序总是升序吗?如果我想按多个值排序呢。例如按名称排序,然后按电子邮件排序。您提供的算法只对一个键进行排序。因为一旦对所有键1进行排序,排序将使用键2调用所有已排序的数组。我试过了,但没有达到我想要的效果。我不确定分类过程在类中是如何进行的。但我可以通过将这两个键组合成单个NSString并仅使用一种比较方法对它们进行排序来获得我想要的结果。我已经包含了上面的代码。很抱歉,但是提供的算法做了一个2键排序,通常组合键可能不会,而且是浪费时间的。我错过了并键入了!在比较过程中。难怪它没有产生我所期望的结果。你的工作很好。很抱歉,在编辑或回复之前,我没有正确检查代码。谢谢你详细的回答。