- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 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;
}*/
最佳答案
在评论中回答您的子问题:
排序是否总是需要升序? - NSOrderedAscending
和 NSOrderedDescending
在这里只是象征性的,您最好将它们视为排序顺序中的“对象在参数之前”和“对象在参数之后” 。例如。如果你正在存储一个 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 键排序,并且通常组合键可能不会而且很浪费。
用两个键排序的英语是这样的:首先比较每个对象的第一个键,如果它们比较不相等则返回它们的顺序。如果它们比较相等,则继续并比较每个对象的第二个键并返回它们的顺序。
这正是上面的伪代码所做的。
由于多种原因,组合多个键是有问题的:
您必须使用键中不能出现的分隔符组合它们。作为一个简单的例子,当你有两个人“jack yolander”和“jacky olander”时,考虑按名字、姓氏排序——一个天真的加入会为两个人生成“jackyolander”,并且他们将排序相等。因此,您需要一个不能出现在任何键中的分隔符。
如果键是不同类型的,例如一个字符串和一个数字,您最终会将它们全部转换为字符串以进行组合 - 浪费,甚至可能不准确。
简单地组合它们是浪费 - 您正在生成不需要的对象。
等等。只需成对比较 key ,直到找到两个不同的 key 或找到最后一对。适用于任意数量、任意类型的键,并且不会造成浪费。
关于objective-c - NSMutableArray 使用选择器排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178402/
在 viewDidLoad 上,我的应用程序填充 NSMutableArray arrayOfHaiku,它是 NSDictionary 项的数组,如下所示: NSError *error; NS
我在 NSMutableArray 上是这样的: NSMutableArray *array = [NSMutableArray arrayWithObjects:@"0",@"0",@"0",@"0
我正在尝试设置我的 allArticlesArray 的内容,然后将附加对象附加到数组中。这是我的代码片段: [self.allArticlesArray setArray:newsArray]; [
我用 NSMutableArray 中的数据填充了 TableView ,一切正常。当我选择一个单元格(didSelectRowAtIndex)时,该项目将从数组中删除,正如它应该做的那样。现在我希望
我有一个 NSMutableArray 是我的代表,我也在我的一个 View Controller 中使用它。 所以在 viewDidLoad 我像这样制作我的 NSMutableArray 的可变副
我有 100 个元素的 NSMutableArray。 我想将“20 - 50”、“10 - 20”、“60 - 100”和 50 - 60. 元素加载到单独的 NSMutableArray 中,并将
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我在尝试将字符串的 NSMutableArray 共享给另一个类时遇到了一些问题。我有一个 tableView,其中填充了 Strings,我想将其添加到 NSMutableArray。然后在另一个
正如我们所知,数组是一个连续的内存分配。那么 NSMutableArray 大小将如何增加。 最佳答案 C 数组确实使用连续内存,C++ std::vector 也是如此,但是 NSMutableAr
我需要对一个数组进行排序,里面有一个数组,像这样: NSMutableArray * array_example = [[NSMutableArray alloc] init]; [array_e
这看起来很简单,但我只是得到一个空数组。 我想获取一个按下的按钮,找到它旁边的所有按钮(参见代码中的注释),并将所有找到的按钮添加到另一个 NSMutableArray。 然后我想遍历该数组并对每个按
我正在尝试在另一个 NSMutableArray 中添加 NSMutableArray。但我想做的是嵌套数组。 我当前的代码是: NSMutableArray *array1 = [NSMutab
我有三个类,即DepartmentViewController、DepartmentRequest、Department。这就像我从 DepartmentViewcontroller 发出部门请求,并
我正在尝试将 NSMutableArray 存储在 NSMutableArray 中。所以 var all:NSMutableArray = NSMutableArray() let localArr
这一定是那些错误之一,您一直盯着代码看很长时间,以至于找不到错误。 我有这个代码块,我在其中循环遍历一个包含多个 NSMutableArray 的 NSMutableArray: // FoodVi
我有一个包含 50 个条目的 NSMutableArray - 有什么简单的方法可以将其分成 5 个 NSMutableArray,每个 10 个条目。 最佳答案 是的,要划分 NSMutableAr
我想将 NSMutableArray 的 addObject 放入 NSMutableArray 中,那么我如何快速实现这一点。并检索它,所以请帮助我,因为现在我正在快速学习。 间接说我要二维数组是指
好吧: 我有 NSMutableArray 1 我还有 NSMutableArray 2 我想从数组 1 中删除与数组 2 中的对象匹配的所有对象。 有什么想法吗? 最佳答案 我刚刚打开文档,打印 N
我正在尝试制作 NSMutableArray 的深拷贝,其对象是与此类似的自定义类的实例: @interface CustomParent : NSObject @property NSInteger
我知道你们可能会觉得这是一个重复的问题。但我对我的项目的这个问题搞砸了。 现在转到这个问题,我已经采取了NSMutableArray命名为 arr1包含字符串值,例如 @"34" , @"40"等等。
我是一名优秀的程序员,十分优秀!