gpt4 book ai didi

objective-c - NSMutableArray 使用选择器排序

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:38 25 4
gpt4 key购买 nike

我在 stackoverflow 上用谷歌搜索,但没有得到满意的答案。

在文档中,它指出:

sortUsingSelector: Sorts the array’s elements in ascending order, as determined by the comparison method specified by a given selector.

  • (void)sortUsingSelector:(SEL)comparator Parameters comparator A selector that specifies the comparison method to use to compare elements in the array. The comparator message is sent to each object in the array and has as its single argument another object in the array. The comparator method should return NSOrderedAscending if the array is smaller than the argument, NSOrderedDescending if the array is larger than the argument, and NSOrderedSame if they are equal.

我正在尝试了解它的实际工作原理。所以如果我在我的对象中有这个方法数组类:

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

并执行它

[myArray sortUsingSelector:@selector(compareNames:);

它有效。问题是我不知道为什么会这样。 NSComparisonResult 的返回类型是升序、相同或降序。我通过阅读文档得到的是将 compareNames 方法发送到 myArray 中的每个对象并比较所选对象对象属性(在本例中为 userName)与另一个对象中的 userName同一个数组。 (例如 [0] 数组与 [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;
}*/

最佳答案

在评论中回答您的子问题:

排序是否总是需要升序? - NSOrderedAscendingNSOrderedDescending 在这里只是象征性的,您最好将它们视为排序顺序中的“对象在参数之前”和“对象在参数之后” 。例如。如果你正在存储一个 NSNumber 的数组然后“1 compareTo:2”应该返回 NSOrderedAscending 如果你想用递增的值排序,而 NSOrderedDescending如果您想按递减值排序。

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

To compare item1 and item2
order = [item1.key1 compareTo:item2.key1];
if (order == NSOrderedSame) order = [item1.key2 compareTo:item2.key2];
return order

根据需要扩展到更多键或更复杂的比较。


评论跟进:

抱歉,提供的算法进行 2 键排序,并且通常组合键可能不会而且很浪费

用两个键排序的英语是这样的:首先比较每个对象的第一个键,如果它们比较不相等则返回它们的顺序。如果它们比较相等,则继续并比较每个对象的第二个键并返回它们的顺序。

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

由于多种原因,组合多个键是有问题的:

  1. 您必须使用键中不能出现的分隔符组合它们。作为一个简单的例子,当你有两个人“jack yolander”和“jacky olander”时,考虑按名字、姓氏排序——一个天真的加入会为两个人生成“jackyolander”,并且他们将排序相等。因此,您需要一个不能出现在任何键中的分隔符。

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

  3. 简单地组合它们是浪费 - 您正在生成不需要的对象。

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

关于objective-c - NSMutableArray 使用选择器排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com