如何使用NSArray上的自定义sorting
我怎样才能在NSArray上执行一个自定义的sorting操作。 我有一个string数组,这是我要的命令。
NSArray A = {cat, dog, mouse, pig, donkey}
而且我有一个不按照我想要的方式排列的string数组。
NSArray B = {dog,cat,mouse,donkey,pig}
什么是最好的方式把数组B与arraysA相同的顺序,而不必使用密钥?
这是一个方法
NSArray *sortedArray = [B sortedArrayUsingComparator: ^(id obj1, id obj2){ NSUInteger index1 = [A indexOfObject: obj1]; NSUInteger index2 = [A indexOfObject: obj2]; NSComparisonResult ret = NSOrderedSame; if (index1 < index2) { ret = NSOrderedAscending; } else if (index1 > index2) { ret = NSOrderedDescending; } return ret; }];
上面的代码将把B的元素排列成与A相同的顺序,元素在B中,但不在A中出现(因为NSNotFound
是一个非常大的数字)。 algorithm的唯一问题是,它将algorithm的复杂度乘以O(n)
,其中n
是A中的对象的数量。因此,对于大的A,它将非常慢。
如果你有:-
NSArray A = {cat, dog, mouse, pig, donkey}
和
NSMutableArray B = {dog,cat,mouse,donkey,pig}
您可以使用:-
[B sortArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { NSUInteger indexOfObj1 = [A indexOfObject: obj1]; NSUInteger indexOfObj2 = [A indexOfObject: obj2]; if(indexOfObj1 == NSNotFound || indexOfObj2 == NSNotFound){ return NSOrderedSame; } else if(indexOfObj1 > indexOfObj2){ return NSOrderedDescending; } return NSOrderedAscending; }];
添加自定义sorting最好的方法是使用sotring和函数
NSArray * B = [A sortedArrayUsingFunction:sortingFunction context:nil]; //sortingfunction
NSInteger sortingFunction(id obj1,id obj2,void * context){
如果(/ /你的条件){
返回NSOrderedDescending;
}
如果(/ /你的条件){
返回NSOrderedAscending;
}
返回NSOrderedSame;
}
检查出sortedArrayUsingComparator ,总是为我工作!
例:
NSArray *sortedArray = [B sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { //Insert custom ordering code here, this will just sort alphabetically. return [obj1 compare:obj2]; }];